2013-03-25 60 views
2

昨天我問了一個類似的問題,但似乎我不得不改變我的方法,所以我做了,但現在我又被卡住了。從var中存儲的表達式定義一個函數

不管怎麼說,我想要做的是沿着

(def bar '(* 2 %)) 
(#(bar) 2) ;this line doesn't work. 
(#(* 2 %) 2) ;this is what I want the line that doesn't work to do. 

東西線東西,我想存儲在一個VAR的表達,所以我可以做類似

(def bar2 (list (first bar) 3 (nth bar 2))) 
(#(bar2) 2) ;this line obviously doesn't work either. 

也許有匿名函數讀取器宏的另一種方法比#

我正在做一個uni項目的遺傳編程,所以我需要做的是有一個表達式,我可以改變並且變成一個函數。

+0

有沒有什麼不能產生'的理由(FN [X](* 2×))' ?即使你在運行時出於某種原因將它作爲列表獲得,你也可以只通過一次eval來生成一個函數,然後存儲和重用該函數。 – 2013-03-26 01:14:23

回答

2
(def bar '(* 2 %)) 

((eval (read-string (str "#" bar))) 3) 
=> 6 

如果用於表達命名參數(S)看起來會更清潔:

(def bar '(* 2 p)) 

(def f-expr (concat '(fn [p]) [bar])) 

((eval f-expr) 3) 
=> 6 
1

如果你想在運行時(而不是編譯的時候,點菜宏)來評估引用的表達式,你可以使用eval

(eval '(* 10 12)) 
;=> 120 

(def arg 12) 
(def bar '(* 10 arg)) 
(eval bar) 
;=> 120 

通常一個繞開的eval(宏將表現更好),但它可能是你想要用遺傳算法玩的東西。

相關問題