String 从字符串读取Lisp对象

String 从字符串读取Lisp对象,string,common-lisp,String,Common Lisp,我熟悉从文件中收集Lisp对象的基本模板,如: (with-open-file (stream "filename.lisp") (loop for object = (read stream nil 'eof) until (eq object 'eof) collect object)) 但我不确定如何将此转换为从字符串收集对象,例如使用从字符串读取。然后,您是否必须跟踪您在字符串中中断的索引?此外,如何避免与输入中的eof或任何其他合法Li

我熟悉从文件中收集Lisp对象的基本模板,如:

(with-open-file (stream "filename.lisp")
    (loop for object = (read stream nil 'eof)
          until (eq object 'eof)
          collect object))
但我不确定如何将此转换为从字符串收集对象,例如使用从字符串读取。然后,您是否必须跟踪您在字符串中中断的索引?此外,如何避免与输入中的eof或任何其他合法Lisp对象(如nil或t)发生名称冲突?

您可以使用它来读取字符串

为了防止与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))

在另一个答案中,sds指出有些人通常使用stream对象本身:readstream nil stream。我得到一个未定义的变量:eof。使用make-symbol-eof,一切都能正常工作吗?我还不太明白的是,既然eof标记是在读取字符串之前创建的,为什么在读取字符串时,例如在读取from:eof时,不会出现变量冲突。是因为eof标记没有被拘留吗?是的,是因为它没有被拘留。因此,阅读器不可能返回相同的符号——每次读取:eof时,它都会创建一个新的、非内部的符号。