Подтвердить что ты не робот

В Clojure разница между функцией, цитируемой функцией и функцией острой кавычки

В clojure, я хотел бы знать, каковы различия между тремя ниже.

(println (map + '(1 2 3) '(4 5 6))) 

(println (map '+ '(1 2 3) '(4 5 6))) 

(println (map #'+ '(1 2 3) '(4 5 6))) 

Результаты

(5 7 9) 

(4 5 6) 

(5 7 9) 

Я не могу понять второе поведение.

Я чувствую, что первый, а третий один в clojure, который равен Lisp -1 и не проводит различия между оценкой переменной и идентично названной функцией.

Это может быть основной вопрос, но, похоже, не хватает информации. Пожалуйста, научите меня.

Спасибо.

4b9b3361

Ответ 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