Macros 用memfn定义函数
我正在开发一些java库包装器。 我们有一些带有方法的对象,可以使用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) 但我
调用它们(.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)))方法)