Common Lisp:为什么预测是一种特殊的形式?

Vic*_*tov 16 common-lisp

由于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表单,因为它不在顶层.

  • 什么"顶级形式"意味着什么? (3认同)

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(由莱纳首先提到的)是,它使各种形式的顶层,这使得它有可能宏扩展到多个表格(见,例如,我的回答",'返回的值是未使用’的警告时字节- 编译宏").