Function 编写Clojure[…]向量函数宏
我想写一个Clojure vector宏表单[…],我可以使用[inc%1%2],它相当于fn[a b][inc a b]或vector inc%1%2Function 编写Clojure[…]向量函数宏,function,vector,clojure,macros,Function,Vector,Clojure,Macros,我想写一个Clojure vector宏表单[…],我可以使用[inc%1%2],它相当于fn[a b][inc a b]或vector inc%1%2 这是一个特殊的数据读取器,还是可以用defmacro编写?只是为了开个玩笑,我写下了可能是最接近解决方案的方法。它没有定义读卡器宏,但是它定义了一个宏,它几乎允许您所寻找的语法 我不得不重新设计轮子,以允许%样式的隐式参数,因为我无法让滥用工作: 这定义了一个模仿读取器宏的常规宏。它的计算结果是一个变量函数,该函数在列表中的前5个参数绑定到百分
这是一个特殊的数据读取器,还是可以用defmacro编写?只是为了开个玩笑,我写下了可能是最接近解决方案的方法。它没有定义读卡器宏,但是它定义了一个宏,它几乎允许您所寻找的语法 我不得不重新设计轮子,以允许%样式的隐式参数,因为我无法让滥用工作: 这定义了一个模仿读取器宏的常规宏。它的计算结果是一个变量函数,该函数在列表中的前5个参数绑定到百分比符号。它允许%样式参数:
(mapv (lambda (* % %2)) [1 2 3] [1 5 9])
[1 10 27]
然后,您可以使用它来定义一个宏,它几乎可以完成您所要查找的任务:
(defmacro vec-f [& elems]
`(lambda (vec ~(vec elems))))
但我不能说我推荐使用它
它不适合阅读
没有抛出arityException,丢失的参数将通过解构默认为nil
它最多只允许%5;虽然这是一个硬编码的限制,可以增加。使用当前的var arg方法,我不能允许任意数量的参数。试图在编译时实现一个无限列表显然会以眼泪告终
不过,作为一个概念证明,它表明你所追求的几乎是可能的
你应该用
#(vector (inc %1) %2)
相反,或者,正如评论中所建议的那样
#(do [(inc %1) %2])
这是不可能的,请参阅和。Clojure中没有用户读取器宏。类似的外观可以通过标记的文字来实现。否则执行[inc%1%2]
#(vector (inc %1) %2)
#(do [(inc %1) %2])