我想这样做(在REPL或任何地方)
(defn (symbol "print-string") [k] (println k))
然后能够做到
(print-string "lol")
或者,如果还有其他方法可以在宏中创建自定义字符串defn,那么你能不能指引我走向正确的方向?
答案 0 :(得分:21)
(defmacro defn-with-str [string args & body]
`(defn ~(symbol string) ~args ~@body))
(defn-with-str "print-string" [k] (println k))
(print-string "lol")
答案 1 :(得分:17)
dnolen的解决方案在宏扩展时工作,Brian Carper在阅读时。现在,这是运行时的一个:
(intern *ns* (symbol "a") (fn [k] (println k)))
答案 2 :(得分:14)
我更喜欢dnolen的答案,但你也可以这样做:
(defn #=(symbol "print-string") [k] (println k))在阅读时评估
#=()
。我不知道Clojure的功能有多稳定,我不会依赖它不会在将来改变。我是怎么做的。
答案 3 :(得分:7)
仅供参考 - dnolen的答案仅适用于文字字符串,而不适用于def'd或let'd变量中的字符串。
(defmacro defn-with-str [string args& body] `(defn~(符号串)~args~ @ body))
(def hisym“hi”) (defn-with-str hisym [](println“hi”))
你现在有一个名为“hisym”的功能
(hi) - > java.lang.Exception:无法解析符号:hi在此上下文中(NO_SOURCE_FILE:6) (hisym) - >打印“hi”
为避免这种情况,请在宏
中评估函数名称字符串
(defmacro defn-with-str [string args & body]
`(defn ~(symbol (eval string)) ~args ~@body))