Прежде всего, ограничение распространяется только на требуемые позиционные аргументы ; вы всегда можете использовать переменную arity case (& more-args
в сигнатуре функции) для обработки столько аргументов, сколько захотите:
(defn foo [& args]
(count args))
(foo 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25)
;; returns 25
На самом деле, на первый взгляд, & args
, скорее всего, будет правильным решением вашей проблемы. (Например, вы сможете отобразить функцию на свои входные узлы, собранные в последовательность, loop
/ recur
на указанную последовательность и т. Д. - имеет больше смысла с большим количеством похожих элементов, чем с присвоением отдельных имен каждому из них.
(Обратите внимание, что я не претендую на то, чтобы знать природу конкретного DSL, который вы транскрибируете в Clojure, или тип проблем, с которыми вы имеете дело, просто предлагая моменты, которые могут вас заинтересовать. Если вы У нас действительно странная ситуация, когда кажется, что это неприменимо, может быть, вы можете предоставить более подробную информацию, и мы посмотрим, сможет ли кто-нибудь здесь предложить несколько полезных советов для решения этой проблемы в Clojure.)
Ради полноты можно добавить бит & args
в функцию, которая принимает свои первые 19 аргументов в качестве требуемых позиционных аргументов:
(defn bar [a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 & as]
(+ 19 (count as)))
(bar 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25)
;; returns 25
Обратите внимание, что если вы укажете 20 позиционных аргументов и &
аргумент поверх этого, очевидно, возникнет странность.
Что касается логического обоснования, я полагаю, что это связано с тем фактом, что JVM может очень эффективно отправлять методу по методу, поэтому класс clojure.lang.Fn
имеет метод invoke
, перегруженный для арностей до 20. I Я не совсем уверен, может ли он пойти выше, чем это, но я полагаю, что это не то, что люди часто требуют ... Я имею в виду, что я определенно нахожу любой API, указывающий более 20 позиционных аргументов функции, немного подозрительным.