Быстрый обходной путь: используйте let вместо привязки , и это будет работать для вас просто отлично:
user=> (let [+ list] (+ 2 3))
(2 3)
Немного (не полностью) копаясь в причине:
Посмотрите на источник для функции +:
(defn +
"Returns the sum of nums. (+) returns 0."
{:inline (fn [x y] `(. clojure.lang.Numbers (add ~x ~y)))
:inline-arities #{2}}
([] 0)
([x] (cast Number x))
([x y] (. clojure.lang.Numbers (add x y)))
([x y & more]
(reduce + (+ x y) more)))
Обратите внимание, что существует несколько встроенных определений функций для различного числа аргументов. Если вы попытаетесь повторно связать определения арности 0 или 1, все будет работать нормально:
user=> (binding [+ (fn [] "foo")] (+))
"foo"
user=> (binding [+ (fn [a] (list a))] (+ 1))
(1)
Теперь, это определенно не работает (как вы обнаружили) для случая с двумя аргументами. Я не совсем соединяю точки, но. (особая форма) делает меня подозрительным в сочетании с макросом привязки, тогда как пусть это особая форма ...
Метаданные, специально вызывающие arity 2, также кажутся подозрительными.