15

我想这样做(在 REPL 或任何地方)

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

然后能够做到

(print-string "lol")

或者,如果有任何其他方法可以从宏中的自定义字符串创建 defn,您能否将我推向正确的方向?

4

4 回答 4

22
(defmacro defn-with-str [string args & body]
 `(defn ~(symbol string) ~args ~@body))

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

(print-string "lol")
于 2009-03-24T21:40:53.233 回答
17

dnolen 的解决方案在宏扩展时有效,Brian Carper 在读取时有效。现在,这是运行时的一个:

(intern *ns* (symbol "a") (fn [k] (println k)))
于 2009-03-24T23:03:01.647 回答
14

我更喜欢 dnolen 的回答,但你也可以这样做:

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

#=()在读取时进行评估。我不知道 Clojure 的一个特性有多稳定,我不会指望它在未来不改变。宏是我的做法。

于 2009-03-24T21:59:52.643 回答
7

仅供参考 - dnolen 的答案仅适用于文字字符串,不适用于 def'd 或 let'd 变量中的字符串。

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

(def hisym "hi") (defn-with-str hisym [] (println "hi"))

你现在有一个名为“hisym”的函数

(hi) -> java.lang.Exception: Unable to resolve symbol: hi in this context (NO_SOURCE_FILE:6) (hisym) -> 打印“hi”

为避免这种情况,请评估宏中的函数名称字符串

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

于 2010-03-10T00:53:47.763 回答