我想读取STDIN的输入,只读它是什么:如果输入是一个列表,那么读取的是一个列表。但是,read-line函数似乎总是返回一个字符串! 例如:in clisp interactive envrironment:
(read-line)
我输入:
("(define M ::int )" "(define X ::int )")
它会给我一个字符串:
"(\"(define M ::int )\" \"(define X ::int )\")" ;
我想要的仍然是原始列表:("(define M ::int )" "(define X ::int )")
那么如何使读取线读入输入的内容?
答案 0 :(得分:13)
只需使用:
(read)
那应该有用
答案 1 :(得分:1)
(let ((a read)))
(eval a))
(+ 2 2 2)
=> 6
他们之所以称之为READ EVAL PRINT LOOP。
答案 2 :(得分:1)
让用户输入Lisp表达式肯定有风险。因此,我可以通过将读取函数包装在忽略错误中来保护读取函数:
(ignore-errors (read))
这样,如果用户输入例如“)”(不带引号),解释器将不会进入调试循环,而只是打印一条错误消息并返回nil。
答案 3 :(得分:0)
(read-line)
返回以换行符结尾的字符串。
(read)
是Lisp解析器。
答案 4 :(得分:0)
正如其他人指出的那样,(read)
可以满足您的需求。原因如下:READ
带有一个可选参数,用于指定要从中读取的输入流。默认为*STANDARD-INPUT*
,指定STDIN,这就是为什么它不带参数就可以工作的原因,但是您可以指定要读取的其他流(例如文件)。例如(with-open-file (s path) (read s))
。