您可以通过运行轻松检查您的特定 CL 实现是如何实现的,defun
(macroexpand '(defun add2 (x) (+ x 2)))
在SBCL 上,它扩展为:
(PROGN
(EVAL-WHEN (:COMPILE-TOPLEVEL) (SB-C:%COMPILER-DEFUN 'ADD2 NIL T))
(SB-IMPL::%DEFUN 'ADD2
(SB-INT:NAMED-LAMBDA ADD2
(X)
(BLOCK ADD2 (+ X 2)))
(SB-C:SOURCE-LOCATION)))
T
要查看实现的特定源代码,我将使用(在 Emacs 上)M-. 键绑定,然后我将编写 defun 并按 Enter。然后 Emacs 会得到源代码:
(sb!xc:defmacro defun (&environment env name lambda-list &body body)
#!+sb-doc
"Define a function at top level."
[...]
我不打算粘贴整个宏,因为它很长。如果你不在 Emacs 上,你可以尝试在 repos 中搜索,因为大多数实现都是开源的。
顺便说一句,defun 并没有那么特别。您可以使用 setf-inf 和 symbol-function 到 lambda 来实现大部分功能。例如:
(setf (symbol-function 'ADD3) #'(lambda (x) (+ x 3)))
; => #<FUNCTION (LAMBDA (X)) {1006E94EBB}>
(add3 4)
; => 7