我正在開發一個遺傳編程愛好項目。let *和set之間的區別?在Common Lisp
我有一個函數/宏設置,當以setq/setf形式進行求值時,將生成一個如下所示的列表。
(setq trees (make-trees 2))
==> (+ x (abs x))
然後,它會得到通過戰略性地使用功能/宏綁定了一個lambda函數#<FUNCTION :LAMBDA (X) ... >
不過,我想用這種更有效一點比手動分配給變量,所以我寫了這樣的事情:
(setq sample
(let* ((trees (make-trees 2))
(tree-bindings (bind-trees trees))
(evaluated-trees (eval-fitness tree-bindings))))
(list (trees tree-bindings evaluated-trees)))
但是,我得到EVAL: trees has no value
當我把它放在let形式。我的懷疑是,與SETF相比,宏觀擴展沒有在LET中完全實現,但這對我來說沒有意義。
這個問題的原因是什麼?
---編輯:猛拉我的代碼,並把整個文件中的一個引擎收錄---
假設我決定一setq是不會做對我來說,我寫一個簡單的功能做到這一點:
(defun定義生成樣本() (讓((特威格斯(使樹2))) (讓((樹綁定(綁定樹特威格斯))) (讓((評估 - 樹(eval-fitness樹綁定)))
(list twiggs tree-bindings evaluate-trees)))))
這產生了......幫助文件錯誤消息(??!?)......和「eval:變量twiggs沒有值」的爆炸式增長,這源於SLIME檢查上的綁定樹定義。
我相當確定我已經徹底清理了我的宏。 http://pastebin.org/673619
我不明白到底是什麼宏在做什麼。什麼是你的「功能/宏」的戰略使用,以及所有的頂級'setq's是什麼? – Ken 2010-08-19 05:16:40
那麼,一個setq就是全球「人口池」。其他人只是發展的文物。我的宏從相當隨意的表達式樹中動態地生成一個函數(它會變得很「複雜」)。 – 2010-08-19 05:23:24
您的第二個片段不完整。 「let」形式的內容會發生什麼?縮進也是誤導,括號不平衡。 – Svante 2010-08-19 14:46:08