由于Common Lisp的函数参数按从左到右的顺序进行求值,为什么不使用普通函数:
(defun progn2 (&rest body)
(first (last body)))
Run Code Online (Sandbox Code Playgroud)
而不是特殊的形式?
Rai*_*wig 26
还有另一个功能PROGN,你不能使用一个功能:
想象一下Common Lisp代码文件中的这段代码:
(progn
(defmacro foo () ))
Run Code Online (Sandbox Code Playgroud)
与
(my-progn
(defmacro foo () ))
Run Code Online (Sandbox Code Playgroud)
使用PROGN编译器会将DEFMACRO表单视为顶级表单.这意味着例如编译器注意到存在宏定义并使其在编译时环境中可用.
使用函数MY-PROGN,编译器将无法识别DEFMACRO表单,因为它不在顶层.
sds*_*sds 23
progn 返回它评估的最后一个表单的所有值,你的函数只返回第一个:
(progn (values 1 2 3))
=> 1, 2, 3
(progn2 (values 1 2 3))
=> 1
Run Code Online (Sandbox Code Playgroud)
另一个关键特征progn(由莱纳首先提到的)是,它使各种形式的顶层,这使得它有可能宏扩展到多个表格(见,例如,我的回答",'返回的值是未使用’的警告时字节- 编译宏").