在这种情况下如何使用“循环”?

时间:2011-09-21 03:18:31

标签: lisp clisp

以下代码将引发:SYSTEM ::%EXPAND-FORM:(SETQ NUM(SUBSTRING LINE 6))应该是lambda表达式。

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

此致!

2 个答案:

答案 0 :(得分:4)

你需要删除这样的最外层的parens。

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

循环体周围有一个隐式progn,当你添加额外的parens时,读者会期望列表中的第一件事(在这种情况下(setq num (substring line 6))是一个带有函数的符号。显然setq形式不符合该标准,因此它会失败,但我不确定为什么它告诉你它应该是一个lambda表达式。

样式说明:

不要使用parens,就像在Java或C ++中使用花括号一样!

do (
     &body
   )

是糟糕的Lisp风格,在我的答案中关闭最后一行的所有parens,并在左边的paren开始的同一行上打开parens。

答案 1 :(得分:3)

您需要PROGN special form按顺序评估所有这些表达式。

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