2011-09-21 91 views
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

您需要删除最外面的一组parens。

(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风格不好,关闭最后一行的所有parens,就像我在答案中所做的那样,并在与左paren开始的形式相同的行上打开parens。

3

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

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

你实际上并不需要'progn',你只需要移除最外面的一组parens。 '(循环...做...)'做了一个隐含的预后。 – asm

相关问题