2009-03-24 5 views

答えて

21
(defmacro defn-with-str [string args & body] 
`(defn ~(symbol string) ~args [email protected])) 

(defn-with-str "print-string" [k] (println k)) 

(print-string "lol") 
+0

1に〜は、引数の前には何ですか? 2.体の前に〜@は何ですか? – Belun

+1

@Belun 1.〜= unquote 2.〜@ =展開シーケンス – Surya

+0

なぜ私はそうですか?(defn defns [](don(map(fn [s](defn-with-str s [k](println k ))))))) "f"という名前の "s"を取得しますか? – Hendekagon

14

私はdnolenさん好きには良い答えが、あなたはあまりにもこれを行うことができます。

(defn #=(symbol "print-string") [k] (println k))

#=()は、読み取り時に評価されます。私はClojureの機能がどれくらい安定しているかわからないが、今後変更しないことには依存しないだろう。マクロは私がそれをやる方法です。

17

dnolenのソリューションは、マクロ展開時にBrian Carperが読み取り時に動作します。さて、ここでは、実行時に1つです:FYI

(intern *ns* (symbol "a") (fn [k] (println k))) 
+0

クールはそれについて知りませんでした。 1つの注意点は、var aにdefnを使用して取得した関数メタデータがないことです。 – dnolen

7

- のdnolen答えは唯一def'dまたはlet'd変数内の文字列をリテラル文字列のために働く、としません。

(defmacroのDEFN-と-STR [文字列引数&ボディ] `(DEFN〜(記号列)〜argsを〜身体@))

(DEF "HI" hisym) (DEFN-with- STR hisym [](printlnの "HI"))

あなたは今(HI) "hisym"

と呼ばれる機能を持っている - >のjava.lang.Exception:NO_SOURCE_FILEこの文脈でHI(:シンボルを解決できません:6) (hisym) - > "hi"を印刷

これを避けるために

、evalの関数名の文字列マクロ

(defmacro defn-with-str [string args & body]
`(defn ~(symbol (eval string)) ~args [email protected]))

関連する問題