使用defun和setf如下定义的函数的根本区别是什么,并且在样式考虑之外的另一种方法优先于另一种方法?
使用defun:
* (defun myfirst (l)
(car l) )
MYFIRST
* (myfirst '(A B C))
A
Run Code Online (Sandbox Code Playgroud)
使用setf:
* (setf (fdefinition 'myfirst) #'(lambda (l) (car l)))
#<FUNCTION (LAMBDA (L)) {10021B477B}>
* (myfirst '(A B C))
A
Run Code Online (Sandbox Code Playgroud)
如果按照维基百科的说法:
通过使用defun宏将lambda表达式存储在符号中来创建命名函数
使用setf以不同方式创建变量需要使用funcall:
* (defvar myfirst)
MYFIRST
* (setf myfirst (lambda (l) (car l)))
#<Interpreted Function (LAMBDA (X) (+ X X)) {48035001}>
* (funcall myfirst '(A B C))
A
Run Code Online (Sandbox Code Playgroud)
我的理解是这种类型的变量与前一种不同,因为这个变量在与defun绑定符号相同的命名空间中找不到,如为什么有多个命名空间? …