Сколько аргументов ожидает анонимная функция в clojure?
Как Clojure определяет количество аргументов анонимной функции (созданной с помощью #...
запись) ожидать?
user=> (#(identity [2]) 14)
java.lang.IllegalArgumentException: Wrong number of args (1) passed to: user$eval3745$fn (NO_SOURCE_FILE:0)
3 ответа
#(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")
,
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.
Это дает вам ошибку, что вы передали один аргумент вашей анонимной функции, которая ожидала ноль.
Арентность анонимной функции определяется по максимальному аргументу, указанному внутри.
например
(#(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, может быть передано любое количество аргументов
Вам нужно ссылаться на аргументы с%1, %2 и т. Д., Чтобы функция требовала столько аргументов.