在Common Lisp中传递函数

时间:2014-01-05 18:57:42

标签: 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

我的问题: 这是身份功能吗?如果没有,为什么?最后,为什么lambda表达式需要最后一个(x)?任何规范的源材料都将非常感激。感谢。

1 个答案:

答案 0 :(得分:2)

让我尝试逐步分析您的代码

(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