Ответ 1
В отношении третьего случая, в отличие от Common Lisp, #'+
не читается как (function +)
и ссылается на значение символа +
в пространстве имен функций, так как Clojure не имеет пространство имен функций. Вместо этого он читается как (var +)
и ссылается на var
, называемый +
. Применение var
совпадает с применением значения, сохраненного в var
.
Во втором случае вы повторно применяете символ к паре чисел. Это действительно случайно. Применение символа к карте совпадает с индексированием на эту карту:
user> ('a {'a 1, 'b 2, 'c 3, '+ 4})
1
user> ('+ {'a 1, 'b 2, 'c 3, '+ 4})
4
Если вы указываете второй аргумент, он используется как значение по умолчанию, если на карте не найдено соответствующего ключа:
user> ('+ {'a 1, 'b 2, 'c 3} 4)
4
Так как на каждой итерации вы применяете символ +
к паре чисел, а так как число не является картой и поэтому не содержит +
в качестве ключа, второй аргумент возвращается как значение по умолчанию неудачного совпадения.
user> ('+ 'foo 4)
4
user> ('+ {} 4)
4
user> ('+ 1 4)
4