Macros Clojure嵌套宏

Macros Clojure嵌套宏,macros,clojure,nested,Macros,Clojure,Nested,是否可以删除宏返回的宏?我想最大限度地简化代码,我可以使用返回函数的宏来实现这一点。但是,它的开销太大,速度太慢。为了使代码更具可读性,我没有使用类型提示,但即使使用类型提示,我的代码也要慢5倍 我的英语不是很精确,所以我写下我拥有的和我想要的 我有这个 (defmacro系列[java数组] `(fn ([i#] (aget~java数组i#) ([开始、停止] (让[limit#(未选中减去int stop#start#)) 结果#(双数组限制#)] (循环[i#0] (如果(

是否可以删除宏返回的宏?我想最大限度地简化代码,我可以使用返回函数的宏来实现这一点。但是,它的开销太大,速度太慢。为了使代码更具可读性,我没有使用类型提示,但即使使用类型提示,我的代码也要慢5倍

我的英语不是很精确,所以我写下我拥有的和我想要的

我有这个

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