2011-09-21 57 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