1

次のコードは発生します: SYSTEM::%EXPAND-FORM: (SETQ NUM (SUBSTRING LINE 6)) はラムダ式である必要があります。

(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

2 に答える 2

4

このように、最も外側のかっこのセットを削除する必要があります。

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

ループ本体には暗黙的prognなものがあり、余分な括弧を追加すると、リーダーはリストの最初のものを期待します (この場合(setq num (substring line 6))、関数を持つシンボルです。明らかに、setqフォームはその基準を満たしていないため、失敗します) 、ただし、ラムダ式であるべきだと言っている理由はわかりません。

スタイルノート:

Java や C++ で中括弧を使用する場合と同じように、括弧を使用しないでください。

do (
     &body
   )

私の答えにあるように、最後の行のすべてのかっこを閉じ、左のかっこが始まるフォームと同じ行でかっこを開きます。

于 2011-09-21T11:42:46.850 に答える
3

これらの式をすべて順番に評価するには、 PROGN 特殊形式が必要です。

...
do (progn
     (setq num (substring line 6))
     (print line))
...
于 2011-09-21T03:24:13.507 に答える