2015-09-20 170 views
1

Common Lisp具有一個名爲progv的函數,該函數爲給定符號和值列表的表單建立動態綁定。我爲Clojure做了類似的事情。我很確定這在覈心語言中不存在。我想知道我的最佳選擇是什麼。Common Lisp的Clojure中的PROGV

+0

[binding](http://clojuredocs.org/clojure.core/binding)不做你想要的嗎? – bsvingen

+0

這個? https://github.com/richhickey/clojure-contrib/blob/7ea70da82e42416864e2f97e3d314aced34af682/src/clojure/contrib/pprint/pprint_base.clj#L104 – leeor

+0

richhickey/clojure ...回購已過時,請查看clojure github組織 –

回答

3

這裏是用綁定的例子:

user> (def ^:dynamic add +) 
#'user/add 
user> (binding [add -] 
     (add 42 41)) 
1 

,因爲有效率的成本動態綁定,最新版本的Clojure的要求你添加元數據 給需要進行動態綁定的每個符號。

結合僅僅是圍繞着功能push-thread-bindingspop-thread-bindings的包裝,所以如果你想建立這樣的結合動態的,你可以自己調用這些函數,像這樣:

user> (defn with-alternate-addition [number1 number2 addition-function] 
     (push-thread-bindings {#'add addition-function}) 
     (try 
      (add number1 number2) 
      (finally (pop-thread-bindings)))) 
#'user/with-alternate-addition 
user> (with-alternate-addition 42 41 -) 
1 

只是確保你得到的push和pop正確或事情得到確實很難調試。

+1

如果我在編譯時不知道這些符號怎麼辦? – Chris

+0

我會編輯添加到答案。 –

+0

這實際上不是我要找的。這是我想到的一個粗略的片段。 http://pastebin.com/51cKNgWz - 相反,我得到錯誤,我給它'Q'。 '(var q)'也不起作用。 – Chris