multi-arity defn в Clojure first match first serve?

Чтобы быть конкретным, что должно произойти в следующей ситуации:

(defn avg
  ([] 0)
  ([& args] (/ (reduce + args) (count args))))

(avg)

т. е. могу ли я полагаться на то, что clojure всегда будет возвращать 0, а не делить на ноль?


person manualcrank    schedule 15.04.2014    source источник
comment
Что произойдет, если вы попробуете это в REPL?   -  person Alex    schedule 15.04.2014


Ответы (1)


Вы можете полагаться на то, что Clojure возвращает 0, а не делит на ноль. Но это не первый матч, первый обслужен:

(defn avg
  ([& args] (/ (reduce + args) (count args)))
  ([] 0))

(avg)
; 0

Конкретные параметры имеют приоритет над аргументом остальные, как описано здесь.

person Thumbnail    schedule 15.04.2014
comment
Спасибо. Я вам верю, но я не вижу или не понимаю описания как такового. Вы имеете в виду это: одна и только одна перегрузка сама по себе может быть переменной, указав амперсанд, за которым следует один параметр остатка. Такая переменная точка входа, при вызове с аргументами, превышающими позиционные параметры, найдет их в последовательности, содержащейся в остальных параметрах. Если предоставленные аргументы не превышают позиционные параметры, остальные параметры будут нулевыми. - person manualcrank; 16.04.2014
comment
@manualcrank Моя интерпретация такова: только если аргументов больше, чем охватывает любая явная арность, это версия с соответствующим остальным аргументом (мне нужно поспать перед дальнейшим истолкованием :()). - person Thumbnail; 16.04.2014
comment
Хорошо, это имеет смысл и здесь, т. е. точка входа с переменным числом аргументов в этом примере не используется, потому что никакие параметры не превышают нулевых позиционных параметров. - person manualcrank; 16.04.2014