2015-08-23 29 views
8

I rozwiązać problem 58th 4clojure użyciu rekursji, ale potem spojrzałem na inne rozwiązanie i osób, które oceniły tę:Co oznacza "% &" w Clojure?

(fn [& fs] (reduce (fn [f g] #(f (apply g %&))) fs)) 

Która jest bardziej elegancki niż moje rozwiązania. Ale nie rozumiem, co oznacza %&? (Rozumiem, co oznacza %, ale nie w połączeniu z &). Czy ktokolwiek mógłby rzucić trochę światła na to?

Odpowiedz

10

Oznacza to "argumenty dotyczące odpoczynku", zgodnie z this source.

Argumenty w organizmie określa się przez obecność argumentu literałami przyjmując postać%,% N lub% &. % jest synonimem% 1,% n oznacza n-ty arg (1-based), a% & wyznacza odpoczynek arg.

Zauważ, że składnia & to przypomina & more argumentach parametrów funkcyjnych (see here), ale &% prace wewnątrz na anonymous function shorthand.

Niektóre kod porównać funkcje anonimowe, a ich funkcja anonimowa skróconą równoważne:

;; 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 

Zauważ, że Składnia & more lub %& podaje listę pozostałych argumentów.