【发布时间】:2014-06-06 21:57:16
【问题描述】:
是否可以宏返回宏?我想最大限度地简化代码,我可以使用返回函数的宏来做到这一点。但是,它的开销太大而且太慢。为了使代码更具可读性,我没有使用类型提示,但即使使用它们,我的代码也会慢约 5 倍。
我的英语不是很精确,所以我写了我有什么和我想有什么。
我有这个……
(defmacro series [java-array]
`(fn
([i#]
(aget ~java-array i#))
([start# stop#]
(let [limit# (unchecked-subtract-int stop# start#)
result# (double-array limit#)]
(loop [i# 0]
(if (< i# limit#)
(let [r# (double (aget ~java-array i#))]
(aset result# i# r#)
(recur (inc i#)))
result#))))))
我想要这样的东西......
(defmacro series [java-array]
`(defmacro blabla
([i#]
`(aget ~~java-array i#))
([start# stop#]
`(let [limit# (unchecked-subtract-int stop# start#)
result# (double-array limit#)]
(loop [i# 0]
(if (< i# limit#)
(let [r# (double (aget ~~java-array i#))]
(aset result# i# r#)
(recur (inc i#)))
result#))))))
但是当我这样称呼它时......
Wrong number of args (1) passed to: blabla
一个更简单的例子。
我有很多 java 数组。我不想用aget。我希望宏扩展到(aget array-name i)。我编写了一个扩展为(fn [n] (aget array-name i)) 的宏,但这是不必要的开销。
(defmacro series [arr]
`(fn [i#]
(aget (longs ~arr) (int i#))))
我现在声明系列,比如“日期”,并以这种方式调用它(date i),这将返回给我数组的“i”元素。
【问题讨论】:
-
您可以在宏内部调用函数,这些函数在编译时运行并帮助您操作作为参数传递给宏的数据结构(源代码)。我想这可能就是你要找的。不过,从您的示例中,我不太明白您在做什么。你能举个更简单的例子吗?