Сколько аргументов ожидает анонимная функция в clojure? - PullRequest
17 голосов
/ 21 октября 2011

Как Clojure определяет, сколько аргументов ожидает анонимная функция (созданная с нотацией #...)?

user=> (#(identity [2]) 14)
java.lang.IllegalArgumentException: Wrong number of args (1) passed to: user$eval3745$fn (NO_SOURCE_FILE:0)

Ответы [ 3 ]

33 голосов
/ 21 октября 2011

#(println "Hello, world!") -> без аргументов

#(println (str "Hello, " % "!")) -> 1 аргумент (% является синонимом %1)

#(println (str %1 ", " %2 "!")) -> 2 аргумента

и т. Д. Обратите внимание, что вам не нужно использовать все %n s, число ожидаемых аргументов определяется наибольшим значением n. Так что #(println (str "Hello, " %2)) по-прежнему ожидает два аргумента.

Вы также можете использовать %& для захвата остальных аргументов, как в

(#(println "Hello" (apply str (interpose " and " %&))) "Jim" "John" "Jamey").

Из документов Clojure :

Anonymous function literal (#())
#(...) => (fn [args] (...))
where args are determined by the presence of argument literals taking the 
form %, %n or  %&. % is a synonym for %1, %n designates the nth arg (1-based), 
and %& designates a rest arg. This is not a replacement for fn - idiomatic 
used would be for very short one-off mapping/filter fns and the like. 
#() forms cannot be nested.
11 голосов
/ 21 октября 2011

Это дает вам ошибку, что вы передали один аргумент вашей анонимной функции, которая ожидала ноль.

Арентность анонимной функции определяется самым высоким аргументом, на который есть ссылка.

например,

(#(identity [2])) -> arity 0, необходимо передать 0 аргументов

(#(identity [%1]) 14) -> arity 1, необходимо передать 1 аргумент

(#(identity [%]) 14) -> (% - псевдоним для %1, если и только если арность равна 1), необходимо передать 1 аргумент

(#(identity [%1 %2]) 14 13) или

(#(identity [%2]) 14 13) -> arity 2, необходимо передать 2 аргумента

(#(identity [%&]) 14) -> arity n, может быть передано любое количество аргументов

4 голосов
/ 21 октября 2011

Вам нужно ссылаться на аргументы с% 1,% 2 и т. Д., Чтобы функция требовала столько аргументов.

...