更新:
我重寫了這個問題,使原始問題更清晰並添加了全宏解決方案。請忽略此版本,並參閱以下內容:如何自動創建Clojure`defn`函數?
How to create Clojure `defn` functions automatically without macros?
遺憾的是,不會讓我刪除舊版本。
最初由以下問題的動機:Mapped calls to clojurescript macro
假設你想自動創建很多類似的功能(即無需手工寫他們全部)。假設我們有一些預先存在的數據,我們希望寫訪問功能,像這樣:
(def foo
{:able "Adelicious!"
:baker "Barbrallicious!"
:charlie "Charlizable"})
(def bar
{:able "Apple"
:baker "Berry"
:charlie "Kumquat"})
(defn manual-my-foo [item] (get foo item))
(defn manual-my-bar [item] (get bar item))
(manual-my-foo :able) => "Adelicious!"
(manual-my-bar :charlie) => "Kumquat"
所以manual-my-foo
是「硬連接」使用foo
全球地圖。
你可能會認爲你需要一個宏來創建這個函數,這是一個解決方案。但是,宏的一個弱點是它們不能作爲參數傳遞給另一個函數,如map
。因此,我們可以寫出這樣的宏:
(generate-fn :foo) ;=> creates `my-foo` w/o hand-writing it
但下面會失敗:
(map generate-fn [:foo :bar :baz])
我們如何能自動化這些功能的一代?
這原本是由這個問題如果用戶試圖在CLJS自動生成一些回調函數動機:http://stackoverflow.com/questions/43897632/mapped-calls-to-clojurescript-macro?noredirect = 1#comment74871840_43897632我認爲使用'intern'而不是調用宏的宏是一個不錯的解決方案。 –