我使用递归解决了58th 4clojure问题,但后来我查看了另一个人解决方案,发现了这个问题:
(fn [& fs] (reduce (fn [f g] #(f (apply g %&))) fs))
哪个比我的解决方案更优雅。但我不明白%&
的含义是什么? (我确实理解%
的含义,但与&
结合时却不明白。任何人都可以对此有所了解吗?
答案 0 :(得分:11)
根据this source,它意味着"休息参数"。
身体中的论据取决于论证的存在 采用%,%n或%&形式的文字。 %是%1,%n的同义词 指定第n个arg(从1开始),以及%&指定一个休息arg。
请注意,&
语法让人联想到函数参数中的& more
参数(see here),但&%
在anonymous function shorthand内工作。
一些代码来比较匿名函数和它们的匿名函数速记等价物:
;; a fixed number of arguments (three in this case)
(#(println %1 %2 %3) 1 2 3)
((fn [a b c] (println a b c)) 1 2 3)
;; the result will be :
;;=>1 2 3
;;=>nil
;; a variable number of arguments (three or more in this case) :
((fn [a b c & more] (println a b c more)) 1 2 3 4 5)
(#(println %1 %2 %3 %&) 1 2 3 4 5)
;; the result will be :
;;=>1 2 3 (4 5)
;;=>nil
请注意,& more
或%&
语法会列出其余参数的列表。