SWI-PL: read() 在 writeln() / write() 之后,nl 保留所有先前 write() 的输出
SWI-PL: read() after a writeln() / write(),nl holds out the output of all previous write()
我正在尝试制作一个 prolog 菜单,其中脚本要求用户输入一些数据,所以它全是 write()、read()、nl 和一些 writeln() 的链。
问题是由于某种原因,read() 函数会保留写入的输出,直到所有读取完成。这是一个问题,因为所有这些写入都在告诉用户要输入什么。
我做了一个测试代码来展示会发生什么,因为我的实际项目是一团糟:
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
您可能想在 write/1
之后使用 flush_output/0
,如下所示:
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.
所以,我们看到了不同的东西。为什么?
- 我们在不同的操作系统上有不同版本的 SWI-Prolog?
- 你输入的内容和我输入的不完全一样吗?
很难说。但请务必阅读 the documentation of flush_output/0
,那里可能会提供线索。
我正在尝试制作一个 prolog 菜单,其中脚本要求用户输入一些数据,所以它全是 write()、read()、nl 和一些 writeln() 的链。
问题是由于某种原因,read() 函数会保留写入的输出,直到所有读取完成。这是一个问题,因为所有这些写入都在告诉用户要输入什么。
我做了一个测试代码来展示会发生什么,因为我的实际项目是一团糟:
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
您可能想在 write/1
之后使用 flush_output/0
,如下所示:
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.
所以,我们看到了不同的东西。为什么?
- 我们在不同的操作系统上有不同版本的 SWI-Prolog?
- 你输入的内容和我输入的不完全一样吗?
很难说。但请务必阅读 the documentation of flush_output/0
,那里可能会提供线索。