Stream 是否始终需要使用'\n';在Prolog中读取流时?
我使用管道与两个Prolog进程通信,每次我到达Stream 是否始终需要使用'\n';在Prolog中读取流时?,stream,prolog,pipe,iso-prolog,Stream,Prolog,Pipe,Iso Prolog,我使用管道与两个Prolog进程通信,每次我到达read/2谓词从管道读取消息时,程序都会被阻塞并保持这样。我不明白为什么会发生这种情况(我尝试了非常简单的程序),最后我意识到了三件事: 每次我使用write/2发送邮件时,发件人进程必须以结束该邮件\n。如果消息不是这样结束的,则接收方进程将卡在read/2谓词处 如果发送方未刷新输出,则消息不会保留在管道缓冲区中。这可能看起来很明显,但一开始我并不这么认为 虽然未刷新消息时,read/2被阻塞,wait\u for\u input/3根本不被
read/2
谓词从管道读取消息时,程序都会被阻塞并保持这样。我不明白为什么会发生这种情况(我尝试了非常简单的程序),最后我意识到了三件事:
write/2
发送邮件时,发件人进程必须以结束该邮件\n
。如果消息不是这样结束的,则接收方进程将卡在read/2
谓词处read/2
被阻塞,wait\u for\u input/3
根本不被阻塞,因此在这种情况下不需要flush\u output/1
example1 :-
pipe(R,W),
write(W,hello),
read(R,S). % The program is blocked here.
那个也不行:
example2 :-
pipe(R,W),
write(W,'hello.\n'),
read(R,S). % The program is blocked here.
而这两种方法都能起作用:
example3 :-
pipe(R,W),
write(W,'hello.\n'),
flush_output(W),
read(R,S).
example4 :-
pipe(R,W),
write(W,'hello.\n'),
wait_for_input([W],L,infinite).
现在我的问题是为什么?当从管道中读取时(实际上是从您可能想要读取的任何流中读取),Prolog仅“接受”以句点结尾的完整行有什么原因吗?为什么read
阻塞,而等待输入/3
不阻塞(假设消息未刷新)
谢谢 一个有效的Prolog读取项总是以一个句点结束,称为
end char(*6.4.8*)
。在6.4.8其他代币中,标准内容如下:
结束字符后面应跟一个布局字符或%
这就是标准的要求
除了空格、制表符和其他布局字符以及%
之外,句点后的换行符是结束阅读术语的一种可能性。然而,由于TTY和相关缓冲的流行,只使用换行符似乎是一个好习惯
之所以需要end char,是因为Prolog语法允许使用中缀和后缀运算符。考虑作为输入< /P>
f(1) + g(2).
阅读f(1)
时,您可能会认为这已经是整个术语,但您仍然必须等待这段时间,以确保此后没有中缀或后缀
还请注意,您必须使用writeq/1
或write\u canonical/1
生成可读回的输出。您不能使用write/1
作为一个例子,考虑<代码>写([(+])]。首先,这是有效的语法。点后面紧跟着其他字符。备注
通常在结尾处称为句点,而在序言文本中称为点
write/1
将把它写为[.+.]
。请注意,第一个
后面跟着一个空格。所以当这段文字被读回时,
只有[.
将被读取
还有很多其他丑陋的例子,比如这一个,通常它们不会打到你。但是一旦你被击中,你就会被击中