以下代码将引发: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)
...
此致!
答案 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))
...