Macros Clojure嵌套宏
是否可以删除宏返回的宏?我想最大限度地简化代码,我可以使用返回函数的宏来实现这一点。但是,它的开销太大,速度太慢。为了使代码更具可读性,我没有使用类型提示,但即使使用类型提示,我的代码也要慢5倍 我的英语不是很精确,所以我写下我拥有的和我想要的 我有这个Macros Clojure嵌套宏,macros,clojure,nested,Macros,Clojure,Nested,是否可以删除宏返回的宏?我想最大限度地简化代码,我可以使用返回函数的宏来实现这一点。但是,它的开销太大,速度太慢。为了使代码更具可读性,我没有使用类型提示,但即使使用类型提示,我的代码也要慢5倍 我的英语不是很精确,所以我写下我拥有的和我想要的 我有这个 (defmacro系列[java数组] `(fn ([i#] (aget~java数组i#) ([开始、停止] (让[limit#(未选中减去int stop#start#)) 结果#(双数组限制#)] (循环[i#0] (如果(
(defmacro系列[java数组]
`(fn
([i#]
(aget~java数组i#)
([开始、停止]
(让[limit#(未选中减去int stop#start#))
结果#(双数组限制#)]
(循环[i#0]
(如果(
我想要这样的东西
(defmacro系列[java数组]
`(除宏布拉布拉)
([i#]
`(aget~~java数组i#)
([开始、停止]
`(让[limit#(未选中减去int stop#start#))
结果#(双数组限制#)]
(循环[i#0]
(如果(
但是当我把这个叫做
Wrong number of args (1) passed to: blabla
一个简单的例子。
我有很多java数组。我不想使用aget。我希望宏扩展到(aget数组名I)
。我编写了一个宏,可以扩展到(fn[n](aget数组名I))
,但这是不必要的开销
(defmacro series [arr]
`(fn [i#]
(aget (longs ~arr) (int i#))))
现在我声明该系列,例如“date”,并以这种方式调用它
(date I)
,它将返回数组的“I”元素 我认为您正在寻找一种在函数中声明本地宏的方法。这个包有一个表单,我认为您应该能够为本地数组查找创建一个宏
下面是我总结的一个小例子:
; project.clj
(defproject testproject "1.0.0-SNAPSHOT"
:description "FIXME: write description"
:dependencies [[org.clojure/clojure "1.5.0"]
[org.clojure/tools.macro "0.1.2"]])
; src/testproject/core.clj
(ns testproject.core
(:require [clojure.tools.macro :refer [macrolet]]))
(defn my-test []
(let [n 1000
arr (int-array n (range 10))]
(macrolet [(lookup [i] (list `aget 'arr i))]
(loop [i 0, acc 0]
(if (< i n)
(recur (inc i) (+ acc (lookup i)))
acc)))))
免责声明:我只是想表明这是可能的,而不是一个好主意。我个人认为所有这些额外的复杂性都不值得避免
aget
。我建议只使用aget
,因为它只需要几个额外的字符,而且会使代码更清晰/可读。您可以在宏内部调用函数,这些函数在编译时运行,并帮助您操作作为宏参数传递的数据结构(源代码)。我想这可能就是你想要的。不过,从你的例子中,我不太明白你在做什么。你能举个简单的例子吗?
(defmacro lookup-binding [[fn-sym value] & body]
(let [array-sym (symbol (str fn-sym "-raw"))]
`(let [~array-sym ~value]
(macrolet [(~fn-sym [i#] (list aget '~array-sym i#))]
~@body))))
(defn my-test2 []
(let [n 1000]
(lookup-binding [arr (int-array n (range 10))]
(loop [i 0, acc 0]
(if (< i n)
(recur (inc i) (+ acc (arr i)))
acc)))))