常见的lisp中的读取行

时间:2011-04-19 19:49:54

标签: lisp common-lisp

我想读取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 )")

那么如何使读取线读入输入的内容?

5 个答案:

答案 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))