我正在尝试创建一个序言菜单,脚本在该菜单中要求用户输入一些数据,因此所有这些都是链写(),read(),nl以及也许是writeln()的。
问题是由于某种原因,read()函数会保留写入的输出,直到所有读取完成为止。这是一个问题,因为所有这些写入都在告诉suer输入什么。
我制作了一个测试代码来显示发生了什么,因为我的实际项目是一团糟:
test:-
write("X is "),
read(X),
writeln("Y is "),
read(Y),
writeln("Z is "),
read(Z),
write([X,Y,Z]).
这是我期望的:
?- test.
X is
|: 1.
Y is
|: 2.
Z is
|: 3.
[1,2,3]
true.
但这就是我得到的:
?- test.
1.
|: 2.
|: 3.
X is Y is Z is [1,2,3]
true.
SWI是线程化的,64位,版本7.6.4,并且我使用的是KDE Neon 5.16.2(基于Ubuntu 18.04,内核4.15.0-54
答案 0 :(得分:0)
您可能想要在flush_output/0
之后使用write/1
,如下所示:
test:-
write("X is "), flush_output,
read(X),
writeln("Y is "), flush_output,
read(Y),
writeln("Z is "), flush output,
read(Z),
write([X,Y,Z]).
但是我实际上无法重现您的问题。有了您的代码,没有任何冲洗,我在终端上看到了
?- test.
X is 1.
Y is
|: 2.
Z is
|: 3.
[1,2,3]
true.
所以,我们看到了不同的事情。为什么?
很难说。但是请务必阅读the documentation of flush_output/0
,可能会发现正在发生的事情。