Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 如何从Clojure中的字符串中定义函数?_Function_Clojure_Metaprogramming_Eval_Defn - Fatal编程技术网

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

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)

我想这样做(在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 #=(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)))