2
我试图创建一个具有默认值&optional
参数的lisp宏。不幸的是,参数的处理方式有所不同,具体取决于它是从默认值还是从提供给宏的参数中读取。下面的代码片段重现该问题:&lisp宏中的可选参数:为什么此变量的行为如此?
(setf table1 '((1 2 3)
(4 5 6))
table2 '((10 20 30)
(40 50 60)))
(defmacro test-lambda (f &optional (tableau table1))
`(list ,f ,tableau))
? (test-lambda 0 table2) ;; This works...
(0 ((10 20 30) (40 50 60)))
? (test-lambda 0) ;; ...but this doesn't
> Error: Car of ((1 2 3) (4 5 6)) is not a function name or lambda-expression.
> While executing: CCL::CHEAP-EVAL-IN-ENVIRONMENT, in process listener(1).
> Type :POP to abort, :R for a list of available restarts.
> Type :? for other options.
1 >
我不太明白为什么宏观不会在第二种情况下,默认值工作。有没有更好的方法来编码或至少是一种解决方法?
感谢,