2017-03-17 79 views
1

我熟悉基本的模板从文件中收集Lisp的对象,如:读Lisp的一个字符串对象

(with-open-file (stream "filename.lisp") 
    (loop for object = (read stream nil 'eof) 
      until (eq object 'eof) 
      collect object)) 

但我不知道如何翻译成聚集到这个对象一个字符串,例如使用read-from-string。你是否必须跟踪你在字符串中遗漏的索引?另外,如何避免在输入中与eof或任何其他合法的Lisp对象(如nilt)发生名称冲突?

+1

[WITH-INPUT-FROM-STRING](http://www.lispworks.com/documentation/HyperSpec/Body/m_w_in_f.htm#with-input-from-string) – Barmar

回答

3

您可以使用with-input-from-string从字符串读取。

为防止与eof符号发生冲突,可以使用动态创建的未插入符号或其他对象。

(with-input-from-string (stream "this is a (list of 3 things)") 
    (loop with eof-marker = '#:eof 
     for object = (read stream nil eof-marker) 
     until (eq object eof-marker) 
     collect object)) 
+0

在另一个答案,SDS指出一些人通常使用流对象本身:'(读流nil流)'。 – coredump

+0

我得到一个未定义的变量'#:eof'。是否所有东西仍然可以通过'(make-symbol“eof”)'正常工作? – davypough

+0

是的。或者只是'#:eof'。或者'(list())'也可以。 –

相关问题