Как я могу использовать цикл для в этой ситуации?

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

Искренне!


person z_axis    schedule 21.09.2011    source источник


Ответы (2)


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

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

это плохой стиль Lisp, закройте все скобки в последней строке, как в моем ответе, и откройте скобки в той же строке, где начинается левая скобка.

person asm    schedule 21.09.2011

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

...
do (progn
     (setq num (substring line 6))
     (print line))
...
person Pillsy    schedule 21.09.2011
comment
На самом деле вам не нужен progn здесь, вам просто нужно удалить самый внешний набор скобок. (loop ... do ...) имеет неявный progn после do. - person asm; 21.09.2011