Function 如何从Clojure中的字符串中定义函数?
我想这样做(在REPL或任何地方) 然后才能做到Function 如何从Clojure中的字符串中定义函数?,function,clojure,metaprogramming,eval,defn,Function,Clojure,Metaprogramming,Eval,Defn,我想这样做(在REPL或任何地方) 然后才能做到 (print-string "lol") 或者,如果有任何其他方法可以从宏中的自定义字符串创建defn,请将我推到正确的方向好吗?我更喜欢dnolen的答案,但您也可以这样做: (defmacro defn-with-str [string args & body] `(defn ~(symbol string) ~args ~@body)) (defn-with-str "print-string" [k] (println k)
(print-string "lol")
或者,如果有任何其他方法可以从宏中的自定义字符串创建defn,请将我推到正确的方向好吗?我更喜欢dnolen的答案,但您也可以这样做:
(defmacro defn-with-str [string args & body]
`(defn ~(symbol string) ~args ~@body))
(defn-with-str "print-string" [k] (println k))
(print-string "lol")
(defn #=(symbol "print-string") [k] (println k))
(defn#=(符号“打印字符串”)[k](println k))
#=()
在读取时计算。我不知道Clojure的一个特性有多稳定,我不会指望它在将来不会改变。宏是我的工作方式。dnolen的解决方案在宏扩展时起作用,Brian Carper的解决方案在读取时起作用。现在,这里有一个用于运行时的:
(intern *ns* (symbol "a") (fn [k] (println k)))
仅供参考-dnolen的答案仅适用于文字字符串,而不适用于def'd或let'd变量中的字符串 (带str的defmacro defn[字符串参数和正文] `(defn~(symbol string)~args~@body)) (def hisym“hi”) (带有str hisym[]的defn(println“hi”)) 现在有了一个名为“hisym”的函数 (hi)->java.lang.Exception:无法解析此上下文中的符号:hi(无源文件:6) (hisym)->打印“hi” 要避免这种情况,请在宏中计算函数名字符串
(带有str[字符串参数和正文]的defmacro defn
`(defn~(symbol(eval string))~args~@body))
酷不知道这件事。需要注意的是,var a将丢失使用defn.1获得的函数元数据。args前面的~是什么?2.身体前面的~@是什么?@Belun 1.~=unquote 2.~@=expand SEQUENCE为什么如果我这样做(defn defns[](doall(map(fn[s](defn with str s[k](println k)))[“print string”])我会得到一个名为“s”的fn?@Hendekagon宏不是常规函数
(intern *ns* (symbol "a") (fn [k] (println k)))