【发布时间】:2013-05-28 13:41:00
【问题描述】:
我们有两种定义函数的方法:defun 和 lambda,我们可以使用 setf 来标记 lambda 函数。
(defun g (x) (* x x))
(setf f (lambda (x) (+ x x)))
函数可以是列表中的第一个元素。
(g 3)
9
或者它可以是其他函数的参数。
(mapcar #'g '(1 2 3))
(1 4 9)
但是对于 lambda,用法有所不同。
(funcall f 3)
6
(mapcar f '(1 2 3))
(2 4 6)
我很好奇这些差异背后的逻辑是什么?
与方案相当一致的用例相比,它更加令人困惑。
> (define (g x) (+ x x))
> (g 3)
6
> (map g '(1 3 4))
(2 6 8)
> (define f (lambda (x) (* x x)))
> (f 2)
4
> (map f '(1 2 3))
(1 4 9)
【问题讨论】:
-
2 个命名空间,一个用于 f 之类的 var,一个用于 g 之类的函数。一旦它被传递到地图中,你就必须
funcallg -
是的,在这种情况下Scheme是一致的。
-
GoZoner:声称方案是一致的就是宗教,因为这意味着其他任何事情都是不一致的。 Lisp 在分离函数和值命名空间方面是一致的,它以一致的方式扩展到进一步的命名空间。例如,
(defclass foo ..)的存在并不妨碍您拥有名为foo的函数或名为foo的词法或动态变量。