nbt*_*rap 5 lisp macros common-lisp
Common Lisp Hyperspec声明"宏表单不能扩展为声明;声明表达式必须显示为它们引用的表单的实际子表达式."
我对"扩展到"的含义感到困惑.由于以下原因,以下宏将无法正常工作:
(defmacro optimize-fully ()
`(declare (optimize (speed 3) (safety 0))))
Run Code Online (Sandbox Code Playgroud)
但是,如果宏扩展只包含一个(declare ...)表达式呢?
(defmacro defun-optimized (name (&rest lambda-list) &rest body)
`(defun ,name ,lambda-list
(declare (optimize (speed 3) (safety 0)))
,@body))
(defun-optimized foobar (a b)
(* a b))
Run Code Online (Sandbox Code Playgroud)
这违反了规范吗?我使用的CL实现,SBCL,并没有抱怨,事实上,上面的宏似乎正如预期的那样工作.是什么赋予了?
Xac*_*ach 13
你的第一个例子正是它所禁止的.你不可能有类似这样的代码:
(defun optimized (a b)
(optimize-fully)
(+ a b))
Run Code Online (Sandbox Code Playgroud)
我有时会看到这样的代码:
(defvar *optimization-settings* '(optimize (speed 3) (safety 0)))
(defun foo (a b)
(declare #.*optimization-settings*)
...)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
228 次 |
| 最近记录: |