Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 编写Clojure[…]向量函数宏_Function_Vector_Clojure_Macros - Fatal编程技术网

Function 编写Clojure[…]向量函数宏

Function 编写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个参数绑定到百分

我想写一个Clojure vector宏表单[…],我可以使用[inc%1%2],它相当于fn[a b][inc a b]或vector inc%1%2


这是一个特殊的数据读取器,还是可以用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])