只是为了一笑,我写了你可能最接近解决方案的内容。它没有定义阅读器宏,但它确实定义了一个几乎允许您正在查找的语法的宏。
我不得不重新发明轮子以允许 % 样式隐式参数,因为我无法滥用 #() 工作:
(defn arg-list
"Returns a lazy-seq of (%, %2, %3, ...) strings."
([] (arg-list 1))
([n] (lazy-seq
(cons (str "%" (if (> n 1) n))
(arg-list (inc n))))))
(defmacro lambda
"Use as you would #(). (map (lambda (* % 2)) [1, 2, 3])"
[& body]
(let [arg-syms (->> (arg-list) (take 5) (mapv symbol))]
`(fn [& ~arg-syms]
~@body)))
这定义了一个模仿#() 阅读器宏的常规宏。它计算为一个可变参数函数,该函数将列表中的前 5 个参数绑定到“百分比”符号。它允许% 样式参数:
(mapv (lambda (* % %2)) [1 2 3] [1 5 9])
[1 10 27]
然后,您可以使用它来定义一个几乎可以满足您要求的宏:
(defmacro vec-f [& elems]
`(lambda (vec ~(vec elems))))
(mapv (vec-f (inc %) %2) [1 2 3] [1 5 9])
[[2 1] [3 5] [4 9]]
但我不能说我推荐使用它。
不过,作为概念证明,它表明您所追求的目标是几乎可能的。
你应该只使用
#(vector (inc %1) %2)
相反,或者,如 cmets 中所建议的那样
#(do [(inc %1) %2])