【发布时间】:2011-02-19 20:56:55
【问题描述】:
我正在尝试(作为自学练习)创建一个 Clojure 宏,该宏将生成代码以将函数应用于整数序列并对结果求和,例如
f(0) + f(1) + f(2) + f(3)
这是我的尝试:
(defmacro testsum [func n]
`(fn [x#] (+ ~@( map (fn [i] `(~func x#)) (range n)))))
但是 x# gensym 似乎出了点问题,我最终得到了两个不同版本的 x,因此该函数不起作用:
(macroexpand '(testsum inc 3))
给予:
(fn* ([x__809__auto__]
(clojure.core/+
(inc x__808__auto__)
(inc x__808__auto__)
(inc x__808__auto__))))
这几乎正是我想要的,除了不同的 809 和 808 版本的 x.....
我做错了什么?我认为 auto gensym 旨在为这种目的创建一个独特的符号?有更好的方法吗?
【问题讨论】:
标签: code-generation clojure macros symbols