guys。在宏中編寫`loop ... collect`時出現問題
今天我想寫西格瑪宏來計算從靈活的表達式輸入的總和。
下面的代碼是我今天下午寫的。但它不符合我的目的。
(defmacro sigma (exp ll)
`(+ ,@(loop for i in ll collect
(progn (setf (elt exp 1) i)
(print exp)
exp)))
)
>>(pprint (macroexpand-1 '(sigma (+ 1 2) (2 3 4))))
>>(+ 2 2)
(+ 3 2)
(+ 4 2)
(+ (+ 4 2) (+ 4 2) (+ 4 2))
我想它的工作原理(+ (+ 2 2) (+ 3 2) (+ 4 2))
但loop collect
給我奇怪的答案。
它爲什麼這樣工作?我有一些方法可以解決這個問題嗎?
即使他沒有變異它,他每次都通過循環收集相同的'exp'對象。 – Barmar
@Barmar我記得我曾經'NCONC'-兩次得到一個雙重大小的列表相同的論點:-) – Sylwester