2011-09-21 17 views
1

次のコードを発行します。SYSTEM ::%EXPAND-FORM:(SETQ NUM(SUBSTRING LINE 6))はラムダ式でなければなりません。どうすればこのような状況で "loop for"を使用できますか?

(defun good-red() 
    (let ((tab (make-hash-table))) 
    (dotimes (i 50) (setf (gethash (+ i 1) tab) 0)) 
    (with-open-file (stream "ssqHitNum.txt") 
     (loop for line = (read-line stream nil) 
      until (null line) 
      do (
       (setq num (substring line 6)) 
       (print line) 
       ))))) 

私が「do」を以下のように変更した場合、それは機能します。しかし、私はここで多くのことをする必要があります。

... 
do (print line) 
... 

よろしくお願い致します。

答えて

4

このような括弧の最も外側のセットを削除する必要があります。

(loop for line = (read-line stream nil) 
     until (null line) 
     do 
      (setq num (substring line 6)) 
      (print line)) 

ループ本体は、あなたが追加したときに、余分な読者が機能を持つシンボルであることをこの場合(setq num (substring line 6))には、リスト内の最初のものを(期待しています。もちろんsetqフォームを括弧、その周りに暗黙のprognを持っていますその基準を満たしていないので、それは私はそれはあなたを伝えるなぜそれがラムダ式でなければなりませんか分からないが、失敗します

スタイルノート:。

あなたが括弧をカーリーと同じように括弧を使用しないでくださいJavaまたはC++!

do (
    &body 
    ) 

は悪いLispスタイルですが、最後の行のすべての括弧を閉じてください。私の答えには、左の括弧が始まるフォームと同じ行に括弧があります。

3

これらの式をすべて評価するには、PROGN special formが必要です。

... 
do (progn 
    (setq num (substring line 6)) 
    (print line)) 
... 
+4

実際にはここでは 'progn'は必要ありません。最も外側の括弧を削除するだけです。 '(loop ... do ...)'は暗黙のprognを持っています。 – asm

関連する問題