从字符串中读取Lisp对象

时间:2017-03-17 22:01:02

标签: string common-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 个答案:

答案 0 :(得分: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))