我正在尝试编写一个宏来生成如下所示的代码:
(defun test ()
(let* ((_ (exp1))
(_ (exp2))
...
(_ (expn)))))
(expn)
调用可能纯粹由于其副作用而被调用,并且它们的返回值(存储在_
中)可能永远不会被使用。这会导致 SBCL 发出样式警告:The variable _ is defined but never used.
如何防止出现此警告?我尝试在代码中的各个位置将变量声明为可忽略(通过
(declare (ignorable _))
),但这不起作用。
PS。如果不可能,使用
_
为每个 (gensym)
生成单独的符号是否是惯用的替代方案?
这很难做到,并且是 CL 标准中不太明确的部分。特别是在类似的情况下
(let ((foo 1)
(foo 2))
(declare ... involving foo ...)
...)
该声明适用于哪个
foo
?或者它适用于所有这些?
这个问题曾经有过讨论,但我忘记了结论。我相当确定不同的实现有所不同。如果您使用宏生成此
let*
表单,那么答案是不要这样做,而是生成一组具有适当声明的嵌套 let
表单。