2017-03-17 10 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シンボルとの競合を避けるために、インラインでないシンボルまたは動的に作成された他のオブジェクトを使用できます。別の答え、SDS中

(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

ある人は、通常、ストリームオブジェクト自体を '(ストリームを読み込みません)'というものを使用していると指摘しました。 – coredump

+0

私は未定義の変数 '#:eof'を取得します。すべてが '(make-symbol" eof ")'でも正しく動作しますか? – davypough

+0

うん。あるいは '#:eof'だけです。または '(list())'も機能します。 –

関連する問題