当前位置:  开发笔记 > 编程语言 > 正文

如何在Clojure中从字符串中定义函数?

如何解决《如何在Clojure中从字符串中定义函数?》经验,为你挑选了4个好方法。

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

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

然后能够做到

(print-string "lol")

或者,如果还有其他方法可以从宏中的自定义字符串创建defn,那么你可以把我推向正确的方向吗?



1> dnolen..:
(defmacro defn-with-str [string args & body]
 `(defn ~(symbol string) ~args ~@body))

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

(print-string "lol")



2> Matthias Ben..:

dnolen的解决方案在宏扩展时工作,Brian Carper在读取时间.现在,这是运行时的一个:

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



3> Brian Carper..:

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

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

#=()在读取时评估.我不知道Clojure的功能有多稳定,我不会依赖它不会在将来改变.宏我是怎么做的.



4> 小智..:

仅供参考 - 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))

推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有