检查是否可以使用基本模型prolog(无模块)可靠地格式化字符串。我有以下代码,我认为它可以工作,但不是:
hello(_) :-
write('\nEnter Name: '),
read(Name),
format('\nThe name you entered is: ~s', [Name]).
如果用户输入Bob.
,则会引发错误,但如果用户输入了"Bob".
或'Bob'.
ERROR: format/2: Illegal argument to format sequence ~s: _G7118
我也尝试用writeq
替换格式,如:
hello(_) :-
write('\nEnter Name: '),
read(Name),
writeq(Name).
哪个不会引发错误但最终会打印_L143
而不是Bob
答案 0 :(得分:2)
(评论太长)
不要像这样使用read
,正如@lurker所解释的那样,它不是用于输入“字符串”或“文本”或完全回答问题。在走这条路之前,问问自己:“为什么?”
Prolog顶级是您的交互式命令行提示符。它与C或任何其他编译语言不同,您需要实际编写解释器。
因此,您的hello/1
可能如下所示:
hello(Name) :-
format("~w~n", [Name]).
当然,您仍需要在提示中说出hello("Bob")
或hello('Bob')
。
如果你想在Prolog顶层制作自己的翻译,这完全是另一回事。
答案 1 :(得分:-1)
正如其他人所说,read/1
只读取有效的Prolog语法。要使用标准Prolog原语读取任意一行文本,您必须逐个字符地读取输入字符:
read_line(Cs) :-
get_code(C),
( C == 0'\n -> Cs = [] % end of line
; C == -1 -> Cs = [] % end of input
; Cs = [C|Cs1], read_line(Cs1)
).
当您使用SWI-Prolog时,通过使用format / 2和(由他人删除)SWI-Prolog标签表示,您也可以使用
read_line(String) :-
current_input(Input),
read_string(Input, "\n", "\r", End, String).
其他系统具有相同或相似的谓词,但它们不是标准化的。