私は、Clojureで文字列から関数をどのように定義するのですか?でカスタム文字列からDEFN作成するための他の方法があれば
(defn (symbol "print-string") [k] (println k))
(REPLにまたはどこか)これを実行し、その後
(print-string "lol")
を行うことができるようにしたいかと思いますマクロス、あなたは私を正しい方向に押してくれますか?
私は、Clojureで文字列から関数をどのように定義するのですか?でカスタム文字列からDEFN作成するための他の方法があれば
(defn (symbol "print-string") [k] (println k))
(REPLにまたはどこか)これを実行し、その後
(print-string "lol")
を行うことができるようにしたいかと思いますマクロス、あなたは私を正しい方向に押してくれますか?
(defmacro defn-with-str [string args & body]
`(defn ~(symbol string) ~args [email protected]))
(defn-with-str "print-string" [k] (println k))
(print-string "lol")
私はdnolenさん好きには良い答えが、あなたはあまりにもこれを行うことができます。
(defn #=(symbol "print-string") [k] (println k))
#=()
は、読み取り時に評価されます。私はClojureの機能がどれくらい安定しているかわからないが、今後変更しないことには依存しないだろう。マクロは私がそれをやる方法です。
dnolenのソリューションは、マクロ展開時にBrian Carperが読み取り時に動作します。さて、ここでは、実行時に1つです:FYI
(intern *ns* (symbol "a") (fn [k] (println k)))
クールはそれについて知りませんでした。 1つの注意点は、var aにdefnを使用して取得した関数メタデータがないことです。 – dnolen
- の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]))
1に〜は、引数の前には何ですか? 2.体の前に〜@は何ですか? – Belun
@Belun 1.〜= unquote 2.〜@ =展開シーケンス – Surya
なぜ私はそうですか?(defn defns [](don(map(fn [s](defn-with-str s [k](println k ))))))) "f"という名前の "s"を取得しますか? – Hendekagon