2011-09-21 2 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 (print line) 
... 

С уважением!

ответ

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 
    ) 

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

3

Для оценки всех этих выражений вам нужен PROGN special form.

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

Здесь вам действительно не нужен 'progn', вам просто нужно удалить самый отдаленный набор паренов. '(loop ... do ...)' имеет неявный прогноз после do. – asm

Смежные вопросы