2017-03-17 125 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())'也可以。 –

相關問題