0

ファイルを開き、EOF まで各行を読み取るのに苦労しています。私は、XLISP に基づいた nyquist を使用していますが、Common Lisp のwith-open-file. 私のコードは次のとおりです。

(let ((in_file (open "/home/soodesune/testfile.csv" :if-does-not-exist nil)))
    (loop for line = (read-line in_file)
         while line do (print line))
    (close in_file))

ナイキストから得られる出力は次のとおりです。

error: unbound variable - LINE

どこが間違っているのかを理解する助けが欲しい


注:私も試しました:

(loop for line = (read-line in_file nil)

しかし、それは次のようになります:

error: too many arguments

アップデート:

Rainer Joswig が提供した情報とリンクを使用して、ファイルを開いて行ごとに読み取るために使用する典型的なコードを見つけることができました。

  1 (do* ((fp (open "test.dat" :direction :input))
  2       (ex (read fp nil) (read fp nil)))
  3  ((null ex) (close fp) nil)
  4  (print ex))

このdo関数には、次の 3 つの基本部分があります。

  1. 1 行目と 2 行目 - ループで使用するために割り当てられた変数、それらの初期値、およびそれらをインクリメントする方法。この場合fpex. fpはインクリメントされず、fp からex初期化されて 1 ずつインクリメントされます(末尾が何のためにあるのかわかりません)readnil
  2. 3 行目 - ループの終了条件と、return expressions終了時に評価され、最後に返されるすべてのリスト。この場合、 exit がいつ発生しex == null、その後nil返されます
  3. 4 行目 - ループの実際の本体。この場合、自明です。

注:の割り当てで使用される方法のように、ある式で割り当てられた変数を後の式で使用できるという点でdo*とは異なります。dofpex

私はあらゆる種類の LISP に無頓着なので、上記のいずれかが間違っている場合は、率直に言ってください。

4

1 に答える 1

3

Nyquist は Common Lisp に基づいていません。初期の XLISP に基づいています。Common Lisp の複雑な LOOP ではなく、単純な LOOP のみをサポートします。

ナイキストのマニュアルを参照してください。

http://www.cs.cmu.edu/~rbd/doc/nyquist/part19.html#226

その LOOP 構文は次のとおりです。

(loop expr...)

Common Lisp の拡張 LOOP 構文はサポートしていません。

于 2012-01-20T22:06:05.090 に答える