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

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

(defun x () "hello")

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

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

(x)

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

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

(setq y (lambda () "I want to be a named function"))
(y)

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

Ответы на вопрос(2)

Решение Вопроса

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

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

(defun foo (x) (1+ x))

(function foo)   ->  #<the function foo>

или короче:

#'foo    ->   #<the function foo>

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

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

(funcall #'foo 1)

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

(defun bar (f arg)
  (funcall f arg arg))

(bar #'+ 2)  ->  4

В случае DEFUN:

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

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

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

(defun foo (list)
  (list list))

(foo '(1 2 3))  ->  ((1 2 3))

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

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

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

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

 07 мая 2018 г., 19:43
@Dmitry В оболочке POSIX,$testпеременная не связана сtest команда / функция.
 30 мар. 2018 г., 11:15
hilarous! и я думал, что Perl особенный с $ foo, @foo,% foo, foo.

Ваш ответ на вопрос