【问题标题】:Reading Lisp objects from a string从字符串中读取 Lisp 对象
【发布时间】:2017-03-17 22:01:01
【问题描述】:

我熟悉从文件中收集 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)发生名称冲突?

【问题讨论】:

标签: string common-lisp


【解决方案1】:

您可以使用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))

【讨论】:

  • 在另一个答案中,sds指出有些人通常使用流对象本身:(read stream nil stream)
  • 我得到一个未定义的变量#:eof。使用(make-symbol "eof"),一切仍能正常工作吗?
  • 我还不太明白的是,由于eof-marker是在读取字符串之前创建的,为什么在读取字符串时不会发生变量冲突,例如在读取时来自“#:eof”。是不是因为eof-marker没有被interned?
  • 是的,因为它没有被实习。因此,读者不可能返回相同的符号 - 每次读取 #:eof 时,它都会创建一个新的非驻留符号。
猜你喜欢
  • 2012-10-16
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-22
  • 2013-07-01
  • 2020-06-18
相关资源
最近更新 更多