lisp中的defun和lambda

lisp中的defun和lambda,lambda,lisp,Lambda,Lisp,定义函数有两种方法:defun和lambda,我们可以使用setf来标记lambda函数 (defun g (x) (* x x)) (setf f (lambda (x) (+ x x))) (mapcar #'g '(1 2 3)) (1 4 9) 函数可以是列表中的第一个元素 (g 3) 9 或者它可以是另一个函数的参数 (defun g (x) (* x x)) (setf f (lambda (x) (+ x x))) (mapcar #'g '(1 2 3)) (

定义函数有两种方法:defun和lambda,我们可以使用setf来标记lambda函数

(defun g (x) (* x x)) 
(setf f (lambda (x) (+ x x)))
(mapcar #'g '(1 2 3))
(1 4 9)    
函数可以是列表中的第一个元素

(g 3)
9
或者它可以是另一个函数的参数

(defun g (x) (* x x)) 
(setf f (lambda (x) (+ x x)))
(mapcar #'g '(1 2 3))
(1 4 9)    
但是,对于lambda,用法是不同的

(funcall f 3)
6

(mapcar f '(1 2 3))
(2 4 6)
我很好奇差异背后的逻辑是什么

与scheme相当一致的用例相比,它更令人困惑

> (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)

参见Kent Pitman的论文

2个名称空间,一个用于var(如f)和函数(如g)。你必须
funcall
g
一旦它被传递到mapYes,在这种情况下,Scheme是一致的。GoZoner:宣称Scheme是一致的是宗教,因为它意味着其他任何东西都是不一致的。Lisp在分离函数和值名称空间方面是一致的,它以一致的方式扩展到更多的名称空间。例如,
(defclass foo..)
的存在并不会阻止您拥有名为
foo
的函数或名为
foo
的词法或动态变量。