Как я могу использовать «цикл для» в этой ситуации? - PullRequest
1 голос
/ 21 сентября 2011

Будет вызван следующий код: 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 (print line)
 ...

С уважением!

Ответы [ 2 ]

4 голосов
/ 21 сентября 2011

Вам нужно удалить самый внешний набор паренов, как это.

(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
   )

- это плохой стиль Лиспа, закройте все парены в последней строке, как я указал в своем ответе, и откройте парены в той же строке, что и форма, в которой начинается левое слово.

3 голосов
/ 21 сентября 2011

Вам нужна специальная форма PROGN , чтобы оценить все эти выражения по порядку.

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