Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macros &;lisp宏中的可选参数:为什么该变量的行为与此类似?_Macros_Lisp_Common Lisp - Fatal编程技术网

Macros &;lisp宏中的可选参数:为什么该变量的行为与此类似?

Macros &;lisp宏中的可选参数:为什么该变量的行为与此类似?,macros,lisp,common-lisp,Macros,Lisp,Common Lisp,我正在尝试创建一个lisp宏,该宏有一个带有默认值的&可选参数。不幸的是,根据是从默认值读取还是从提供给宏的参数读取,参数的处理方式有所不同。下面的代码片段再现了该问题: (setf table1 '((1 2 3) (4 5 6)) table2 '((10 20 30) (40 50 60))) (defmacro test-lambda (f &optional (tableau table1)) `

我正在尝试创建一个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 >
我不太明白为什么宏在第二种情况下不能使用默认值。有没有更好的编码方法,或者至少有一个解决方法

谢谢,

什么 您需要引用默认参数值:

(defmacro test-lambda-1 (f &optional (tableau 'table1))
  `(list ,f ,tableau))
(test-lambda-1 0)
==> (0 ((1 2 3) (4 5 6)))
为什么? 您需要思考:当它看到
(testlambda…
)时

  • 计算结果代码
让我们试试:

(macroexpand '(test-lambda 0))
==> (LIST 0 ((1 2 3) (4 5 6))) ; T
(macroexpand '(test-lambda-1 0))
==> (LIST 0 TABLE1) ; T
(macroexpand '(test-lambda 0 table2))
==> (LIST 0 TABLE2) ; T
(macroexpand '(test-lambda-1 0 table2))
==> (LIST 0 TABLE2) ; T
现在您可以看到错误的来源:您没有引用参数的默认值,因此它被计算了两次