Проблема в двусмысленности. Рассмотрим функцию (fn foo [x y & args])
, которая принимает два необязательных аргумента, а затем любое количество аргументов ключевого слова. Если вы тогда называете это как (foo :bar :baz)
, как ваша программа справится с этим? x
=> :bar
, y
=> :baz
? Или x
и y
не предоставляются с одним :bar
=> :baz
аргументом ключевого слова?
Даже в Common Lisp, который, возможно, обладает даже большей гибкостью, чем Clojure, при разборе параметров функций, смешивать необязательные аргументы и аргументы с ключевыми словами не рекомендуется, по крайней мере, одна популярная книга .
Лучше всего изменить все ваши аргументы на позиционные аргументы или все ваши параметры на аргументы ключевых слов. Если вы используете аргументы ключевого слова, вы можете использовать деструктуризацию хэш-карты, чтобы предоставить значения по умолчанию для «необязательных» параметров ключевого слова.
user> (defn foo [& {:keys [x y bar]
:or {x 1 y 2 bar 3}}]
(prn [x y bar]))
#'user/foo
user> (foo)
[1 2 3]
nil
user> (foo :bar :baz)
[1 2 :baz]
nil