Передача функции в Common Lisp

Я очень новичок в lisp, поэтому, пожалуйста, потерпите меня. Следующий код является попыткой того, что я "думал" как способ передать функцию, но, похоже, это что-то другое:

(defun hello-world () (format t "hello, world!"))                                     
(defun ll (x y) (+ (* 3 y)x))
(defun zz(x)(funcall(λ(x)x)x))
>(zz (hello-world))
>hello, world!NIL
>(zz (ll 3 4))
>15
>(zz 8)
>8

Мой вопрос (ы): это функция идентичности? Если нет, то почему? Наконец, почему последний (x) требуется для лямбда-выражения? Любой канонический исходный материал будет принят с благодарностью. Спасибо.


person macrolyte    schedule 05.01.2014    source источник


Ответы (1)


Позвольте мне попытаться проанализировать ваш код шаг за шагом

(lambda (x) x)

Это функция, которая принимает один аргумент, привязывает к нему переменную x и возвращает x, то есть функцию тождества.

(funcall (lambda (x) x) x)

Это вызывает вышеупомянутую функцию идентификации для аргумента x (не связанного с первыми двумя x в выражении), так что это то же самое, что и x.

(defun zz (x) (funcall (lambda (x) x) x))

Это определяет новую функцию zz, которая, как обсуждалось выше, является функцией идентификации.

Посмотрите на значения, возвращаемые вашими вызовами функций, например:

(zz (hello-world))
hello, world!NIL

hello-world выводит "привет, мир!" и возвращает NIL, которое передается в zz, который, в свою очередь, возвращает свой аргумент без изменений как NIL.

person sds    schedule 05.01.2014
comment
ДА! Большое спасибо! Мне действительно нужна была вторая пара глаз (а мои лямбда-исчисления еще не так хороши...). По крайней мере, теперь я чувствую, что добился небольшого прогресса! - person macrolyte; 05.01.2014