将通过let*声明的变量设置为可忽略

问题描述 投票:0回答:1

我正在尝试编写一个宏来生成如下所示的代码:

(defun test ()
    (let* ((_ (exp1))
           (_ (exp2))
           ...
           (_ (expn)))))

(expn)
调用可能纯粹由于其副作用而被调用,并且它们的返回值(存储在
_
中)可能永远不会被使用。这会导致 SBCL 发出样式警告:
The variable _ is defined but never used.

如何防止出现此警告?我尝试在代码中的各个位置将变量声明为可忽略(通过

(declare (ignorable _))
),但这不起作用。

PS。如果不可能,使用

_
为每个
(gensym)
生成单独的符号是否是惯用的替代方案?

common-lisp sbcl let lexical-scope unused-variables
1个回答
1
投票

这很难做到,并且是 CL 标准中不太明确的部分。特别是在类似的情况下

(let ((foo 1)
      (foo 2))
  (declare ... involving foo ...)
  ...)

该声明适用于哪个

foo
?或者它适用于所有这些?

这个问题曾经有过讨论,但我忘记了结论。我相当确定不同的实现有所不同。如果您使用宏生成此

let*
表单,那么答案是不要这样做,而是生成一组具有适当声明的嵌套
let
表单。

© www.soinside.com 2019 - 2024. All rights reserved.