Могут ли функции протокола Clojure быть различными, как обычные функции? - PullRequest
11 голосов
/ 23 марта 2011

С помощью функций clojure я могу определить:

(defn f [x & xs] (apply some-function x xs))

Я пытаюсь сделать то же самое с протоколом, например,

(defprotocol foo
  (bar [f])
  (baz [f & gs]))

Это компилируется (по крайней мере в REPL), но любой реализующий тип, кажется, терпит неудачу в этом (variadic, baz) метод. Это официально не поддерживается? Источники, с которыми я ознакомился, молчат.

Ответы [ 2 ]

11 голосов
/ 23 марта 2011

Это не поддерживается по причинам, которые дает Стюарт Сьерра.Чтобы вдаваться в подробности, символ & является особенным только в контексте деструктурирования, таком как let или аргументы функции.Как поясняет Стюарт, defprotocol не такой контекст.

Но & все еще является допустимым символом, поэтому вы определили протокол с двумя функциями: bar принимает один аргумент с именем f, а baz занимает три, с именами f, & и gs.

9 голосов
/ 23 марта 2011

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

...