В lisp символ может быть одновременно связан со значением и функцией.Например,
Символ f связан с функцией
(defun f(x) (* 2 x))
Символ f связан со значением
(setq f 10)
Итак, я пишу что-то вроде этого:
(f f)
=> 20
В чем преимущество такой функции?
Символ может иметь как функцию, так и значение. Функция может быть получена с помощью SYMBOL-FUNCTION, а значение - с помощью SYMBOL-VALUE.
Это не полный вид. Common Lisp имеет (как минимум) два пространства имен, одно для функций и одно для переменных. Глобальные символы участвуют в этом. Но для локальных функций символы не задействованы.
Так в чем же преимущества:
между именами для функций и переменных нет конфликтов имен.
Схема: (define (foo lst) (список lst))
CL: (defun foo (список) (список списка))
нет времени выполнения проверяет, действительно ли что-то является функцией
Схема: (определить (foo) (бар))
CL: (defun foo () (bar))
На схеме неясно, что такое BAR. Это может быть число, которое может привести к ошибке времени выполнения при вызове FOO.
В CL BAR либо функция, либо неопределенная. Это никогда не может быть чем-либо еще. Например, это никогда не может быть число. Невозможно связать имя функции с числом, поэтому этот случай никогда не нужно проверять во время выполнения.
Это полезно для повседневных задач, но главная причина в том, что из-за макросов вы поймете, почему, изучив его.