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
Macros 用memfn定义函数_Macros_Clojure - Fatal编程技术网

Macros 用memfn定义函数

Macros 用memfn定义函数,macros,clojure,Macros,Clojure,我正在开发一些java库包装器。 我们有一些带有方法的对象,可以使用调用它们(.method-object…)。我想用函数的数量创建更方便的api(方法对象…) 我写了一个简单的宏: (defmacro ^{:private true} gen-method [method & argv] `(def ~method (memfn ~method ~@argv))) 现在我可以调用(gen-method charAt I)例如,然后我可以使用(charAt“string”1) 但我

我正在开发一些java库包装器。 我们有一些带有方法的对象,可以使用
调用它们(.method-object…
)。我想用函数的数量创建更方便的api
(方法对象…

我写了一个简单的宏:

(defmacro ^{:private true} gen-method [method & argv]
  `(def ~method (memfn ~method ~@argv)))
现在我可以调用
(gen-method charAt I)
例如,然后我可以使用
(charAt“string”1)

但我有很多方法要生成,并希望使用以下方法:

(map #(gen-method (-> %1 name symbol arg)) [:charAt :substring ...])
但这是行不通的。下一个例子也不起作用:

(map #(let [fname (-> %1 name symbol)] (gen-method fname arg)) [:charAt :substring ...])
我需要在宏中更改什么或添加什么以实现正确的行为


谢谢。

您必须在宏本身内部执行
map
操作,因为
map
操作应该在编译时进行,即表单扩展时,而不是在运行时

如下所示:

(defmacro ^{:private true} gen-methods [methods]
`(do 
       ~@(map (fn [[x & i]] (let [m (-> x name symbol)] `(def ~m (memfn ~m ~@i)) )) methods)))

(gen-methods [ [:charAt i] [:substring i]])

您必须在宏本身内部执行
map
操作,因为
map
操作应该在编译时进行,即表单扩展时,而不是在运行时

如下所示:

(defmacro ^{:private true} gen-methods [methods]
`(do 
       ~@(map (fn [[x & i]] (let [m (-> x name symbol)] `(def ~m (memfn ~m ~@i)) )) methods)))

(gen-methods [ [:charAt i] [:substring i]])

“不工作”是什么意思?您收到错误消息了吗?
arg
只是一个符号。可以是什么-它将在
memfn
中显示,正如@OpenSauce所问的,您是否会说明您遇到的确切问题?什么是“不工作”的意思?您收到错误消息了吗?
arg
只是一个符号。可以是什么-它将在
memfn
中播放,正如@OpenSauce所问的,你能说出你的确切问题吗?你是我的英雄。做了一些更正:(defmacro^{:private true}gen method[&methods]
(do~@(map(fn[[x&i]](让[m(->x name symbol)]
(def~m(memfn~m~@i)))methods)))你是我的英雄。进行了一些更正:(defmacro^{:private true}gen方法[&methods]
(do~@(map(fn[[x&i]](let[m(->x name symbol)]
(def~m(memfn~m~@i)))方法)