Wie vermeide ich Byte-Compiler-Warnungen Unused lexical variable
in Funktionen, die mithilfe von Makros definiert wurden, die auf erweitert werden defun
?
Beispielsweise
verwendet das Makro defun-rcirc-command
in
rcirc.el
die target
Variable, die nicht von mehreren Aufrufen verwendet wird.
In Common Lisp kann ich die
ignorable
Deklaration verwenden : (declare (ignorable target))
.
Schlechte Lösungen:
Fügen Sie
(setq target target)
allen Benutzern,defun-rcirc-command
die sie nicht verwendentarget
, etwas Ähnliches hinzu: Dazu müssen viele Makroaufrufe geändert werden.Das Präfixieren der ignorierbaren Variablen mit einem Unterstrich -
_target
- hilft nicht, weil es_
bedeutetignore
, nichtignorable
, dh wenn es verwendet wird, bekomme ichvariable '_target' not left unused
.
quelle
(ignore VAR)
für jedes defun-Argument ein vor die Erweiterung @ body setzen, wodurch die Fehler wahrscheinlich zum Schweigen gebracht werden.Antworten:
Die Art und Weise, wie ich das bisher gemacht habe, besteht darin, einen Aufruf der Form hinzuzufügen
Dieser Funktionsaufruf wird entfernt, aber vorher zählt der Compiler ihn immer noch als Verwendung, sodass die Warnung "nicht verwendet" nicht ausgelöst wird.
quelle
Betrachtet man den Code, so scheint es, dass das Ziel keine globale Variable sein soll, sondern beim Aufruf an die erstellte Funktion übergeben wird. In diesem Fall ist es besser, es als lokales Symbol für das Makro zu erstellen. Ein einfaches Beispiel für ein Makro, das eine Funktion erstellt, die ein Argument akzeptiert und 10 hinzufügt:
Berufung
führt zu einer Funktion namens hamster, die ein Argument akzeptiert.
Dann können Sie anrufen
und es wird zurückkehren
15
.Der Trick besteht darin, ein neues Symbol zu erstellen, das als Argument für die neue Funktion dient.
BEARBEITEN:
Ich habe immer gesehen, dass Sie, wenn Sie sich auf das generierte Symbol im übergebenen Body-Ausdruck beziehen, den Namen wie folgt in den Aufruf aufnehmen:
Was dann die Anrufe in:
wo
was zurückkommt
30
undkehrt zurück
40
.Zugegeben, das nervt mich immer, wenn ich Makros auf diese Weise schreibe, bis ich mir die Verwendung ansehe, in der ein Parameter deklariert und später verwendet wird.
quelle
target
. IOW, Ihr ausgezeichneter Vorschlag ist in diesem speziellen Fall nicht anwendbar.