1

以下代码将引发: 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)
 ...

真挚地!

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表单不符合该标准,因此它将失败,虽然我不确定为什么它告诉你它应该是一个 lambda 表达式。

风格注释:

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

do (
     &body
   )

是糟糕的 Lisp 风格,关闭最后一行的所有括号,就像我在答案中所做的那样,并在左括号开始的表单的同一行打开括号。

于 2011-09-21T11:42:46.850 回答
3

您需要PROGN 特殊形式来按顺序评估所有这些表达式。

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