'foo
соответствует символу FOO.
#'foo
оценивает функцию, связанную с именем FOO.
В Лиспе символ может быть вызван как функция, когда символ FOO имеет функцию привязки. Здесь CAR - это символ, имеющий функцию привязки.
Но это не работает:
(flet ((foo (a) (+ a 42)))
(mapcar 'foo '(1 2 3 4 5)))
Это потому, что FOO как символ не имеет доступа к локальной лексической функции, и система Lisp будет жаловаться, когда foo
не является функцией, определенной в другом месте.
Нам нужно написать:
(flet ((foo (a) (+ a 42)))
(mapcar #'foo '(1 2 3 4 5)))
Здесь (функция foo) или ее сокращенное обозначение # 'foo относится к лексической локальной функции FOO.
Обратите внимание, что в
(funcall #'foo ...)
против
(funcall 'foo ...)
Последний может сделать еще одно косвенное обращение, так как ему нужно искать функцию по символу, в то время как # 'foo обозначает функцию напрямую.
Краткое описание
Если символ имеет привязку функции, вызов функции через символ работает.