从终端查询不打印任何东西
Querying from the terminal doesn't print anything
在命令行中运行时,这个
swipl -g "write(42)" -t "halt"
按预期将 42 打印到 STDOUT
。
然而,这
swipl -g "X = 42" -t "halt"
不打印任何东西,它只是 returns。
如何让它打印它在 REPL 中打印的内容(即 X = 42
)?
注意:这是在 Windows 终端中。让我知道这是否真的适用于 Linux 终端。
正如预期的那样,X = 42
本身 没有任何输出 ,因为 (=)/2
是一个完全纯粹的谓词,它本身不会产生任何副作用. Window、OSX 和所有其他操作系统都是这种情况。
即使有办法获取和重定向顶层输出本身,事实仍然是 SWI 顶层可能会发生变化,您不能依赖未来版本的行为方式与现在相同。从长远来看,你可能会更好地滚动 你自己的顶层 并产生你想要的输出。
推出自己的顶层并不难。诀窍主要是在阅读术语时使用 variable_names/1
选项,这样您就可以跟踪要在答案中显示的变量 names 。这是一个非常简单的开始:
repl :-
read_line_to_codes(current_input, Codes),
read_term_from_codes(Codes, Term, [variable_names(NameVars)]),
call(Term),
report_bindings(NameVars).
repl :- repl.
report_bindings(NameVars) :-
phrase(bindings(NameVars), Bs),
format("~s", [Bs]).
bindings([]) --> [].
bindings([E]) --> name_var(E).
bindings([E1,E2|Rest]) --> name_var(E1), ",\n", bindings([E2|Rest]).
name_var(Name=Var) -->
format_("~w = ~q", [Name,Var]).
format_(Format, Ls) -->
call(format_codes(Format, Ls)).
format_codes(Format, Ls, Cs0, Cs) :-
format(codes(Cs0,Cs), Format, Ls).
示例:
?- repl.
|: X = 4, between(1, 3, Y).
X = 4,
Y = 1
true ;
X = 4,
Y = 2
true ;
X = 4,
Y = 3
true ;
|: X = 7.
X = 7
很容易对其进行修改,使其适用于指定为 arguments 的术语。
请注意,variable_names/1
选项对于以这种方式阅读术语至关重要,并且由于 ISO 标准化工作,越来越多的实施为 read_term/2
和相关谓词提供了它。
这种读取变量名的能力是实现可移植 Prolog 顶层的要求!
我留给你的主要练习是检查 引用 是否在所有情况下都是正确的,并且(如果需要)以他们总是可以的方式给出答案粘贴回终端。要将其扩展到剩余 约束 ,请使用 copy_term/3
和 call_residue_vars/2
收集您可以附加到绑定的未决约束。
在命令行中运行时,这个
swipl -g "write(42)" -t "halt"
按预期将 42 打印到 STDOUT
。
然而,这
swipl -g "X = 42" -t "halt"
不打印任何东西,它只是 returns。
如何让它打印它在 REPL 中打印的内容(即 X = 42
)?
注意:这是在 Windows 终端中。让我知道这是否真的适用于 Linux 终端。
正如预期的那样,X = 42
本身 没有任何输出 ,因为 (=)/2
是一个完全纯粹的谓词,它本身不会产生任何副作用. Window、OSX 和所有其他操作系统都是这种情况。
即使有办法获取和重定向顶层输出本身,事实仍然是 SWI 顶层可能会发生变化,您不能依赖未来版本的行为方式与现在相同。从长远来看,你可能会更好地滚动 你自己的顶层 并产生你想要的输出。
推出自己的顶层并不难。诀窍主要是在阅读术语时使用 variable_names/1
选项,这样您就可以跟踪要在答案中显示的变量 names 。这是一个非常简单的开始:
repl :- read_line_to_codes(current_input, Codes), read_term_from_codes(Codes, Term, [variable_names(NameVars)]), call(Term), report_bindings(NameVars). repl :- repl. report_bindings(NameVars) :- phrase(bindings(NameVars), Bs), format("~s", [Bs]). bindings([]) --> []. bindings([E]) --> name_var(E). bindings([E1,E2|Rest]) --> name_var(E1), ",\n", bindings([E2|Rest]). name_var(Name=Var) --> format_("~w = ~q", [Name,Var]). format_(Format, Ls) --> call(format_codes(Format, Ls)). format_codes(Format, Ls, Cs0, Cs) :- format(codes(Cs0,Cs), Format, Ls).
示例:
?- repl. |: X = 4, between(1, 3, Y). X = 4, Y = 1 true ; X = 4, Y = 2 true ; X = 4, Y = 3 true ; |: X = 7. X = 7
很容易对其进行修改,使其适用于指定为 arguments 的术语。
请注意,variable_names/1
选项对于以这种方式阅读术语至关重要,并且由于 ISO 标准化工作,越来越多的实施为 read_term/2
和相关谓词提供了它。
这种读取变量名的能力是实现可移植 Prolog 顶层的要求!
我留给你的主要练习是检查 引用 是否在所有情况下都是正确的,并且(如果需要)以他们总是可以的方式给出答案粘贴回终端。要将其扩展到剩余 约束 ,请使用 copy_term/3
和 call_residue_vars/2
收集您可以附加到绑定的未决约束。