почему defun отличается от (setq <name> <lambda>)?
==============================================================

Я запутался в том, как работает макрос defun, потому что

создаст функцию x, но символ x по-прежнему не будет привязан.

Если я свяжу некоторую лямбду с x, тогда x будет иметь значение, но интерпретатор не будет рассматривать его как функцию в такой форме:

Я думаю, что это связано с тем, что defun должен определять функцию в глобальной среде, но я не уверен, что именно это означает. Почему я не могу скрыть это в текущей среде?

Есть ли способ заставить интерпретатор трактовать символ как функцию, если к нему привязана какая-то лямбда? Например:

P.S .: Я использую SBCL.

Вы определяете функции в пространстве имен функций с помощью`DEFUN`, `FLET`, `LABELS` и некоторые другие.

Если вы хотите получить объект функции в качестве значения, вы используете`FUNCTION`. 

или короче:

Если вы хотите вызвать функцию, то вы пишете`(foo 100)`.

Если вы хотите вызвать функцию как значение, вам нужно использовать`FUNCALL` или же`APPLY`:

Вы можете передавать функции и вызывать их:

В случае DEFUN:

Это не`(setf (symbol-value 'FOO) (lambda ...))`.

Это больше похоже`(setf (symbol-function 'foo) (lambda ...))`.

Обратите внимание, что два пространства имен позволяют писать:

Нет конфликта между встроенной функцией`LIST` и переменная`LIST`, Поскольку у нас есть два разных пространства имен, мы можем использовать одно и то же имя для двух разных целей.

Отметим также, что в случае локальных функцийsymbol участвует. Пространства имен не обязательно связаны с символами. Таким образом, для локальных переменных поиск функции по имени символа невозможен.



 включая слот значения и слот функции. Когда вы используете синтаксис`(x)`обычный lisp ищет функцию-слот-привязку`x`, Если вы хотите вызвать привязку значения, используйте`funcall` или же`apply`. 

Увидеть<http://cl-cookbook.sourceforge.net/functions.html>