gpt4 book ai didi

macros - 用 memfn 定义函数

转载 作者:行者123 更新时间:2023-12-04 18:16:44 24 4
gpt4 key购买 nike

我正在研究一些 java 库包装器。
我们有一些带有方法的对象,可以用 (.method object ...) 调用它们.我想创建更方便的具有许多功能的 api (method object ...) .

我写了一个简单的宏:

(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]])

关于macros - 用 memfn 定义函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11521699/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com