Ich möchte den Effekt einer statischen Variablen erhalten, indem ich defun
inside of let
mit lexikalischer Bindung verwende, um einen Abschluss zu erstellen. Beim Byte-Kompilieren der Datei erhalte ich jedoch eine Warnung. Mache ich etwas falsch oder gibt es eine Möglichkeit, diese Warnung zu unterdrücken?
Ich habe ein MCVE erstellt:
;; -*- lexical-binding: t -*-
(let ((count 0))
(defun increase-count ()
(interactive)
(setq count (1+ count))
(message "Count is: %d" count))
;; The warning happens here.
(increase-count))
Der Code funktioniert wie erwartet: Die Funktion gibt increase-count
"Count is: n" aus, wobei sich n bei jedem Aufruf erhöht. Beim Kompilieren dieser Datei mit Bytes erhalte ich jedoch die folgende Warnung:
In end of data:
mcve.el:11:1:Warning: the function ‘increase-count’ is not known to be
defined.
Es scheint mir, dass increase-count
immer definiert werden sollte, bevor es am Ende des Let-Blocks aufgerufen wird. Ist das nicht der Fall?
byte-compilation
lexical-scoping
defun
lexical-binding
Will Kunkel
quelle
quelle
defun
Tut nicht das, was Sie denken, sondern erstellt immer eine Definition auf oberster Ebene. Elisp ist immerhin nicht Schema ...Antworten:
Die Art und Weise des Byte-Compilers zu entscheiden, ob eine Funktion definiert wird oder nicht, ist sehr "naiv" und wird selbst in Ihrem "offensichtlichen" Fall getäuscht. Sie können es jedoch so schreiben, dass der Compiler versteht, was passiert:
Noch besser wäre es natürlich, die Logik des Byte-Compilers zu verbessern: Patches sind dafür willkommen.
quelle
Um die Warnung des Byte-Compilers zu unterdrücken, fügen Sie diese vor Ihrem Code hinzu, beginnend in Spalte 0 (ganz links):
C-h f declare-function
sagt Ihnen:quelle
FILEONLY
für den vorliegenden Fall ein Nicht-Null- Argument erforderlich? Übrigens hätte ich die gleiche Antwort gegeben ;-).FILEONLY
schien hier nicht nötig zu sein, für mich. Was darauf hinzudeuten scheint, dass dascheck-declare
erkenntf
undg
zunichte macht.f
undg
nur im Zusammenhang mit emacs.stackexchange.com/q/39439 Sinn macht ?FILEONLY
schien hier für mich nicht nötig zu sein. Was anscheinend darauf hindeutet, dasscheck-declare
derincrease-count
Verstorbene erkennt . ;-)Ich glaube, die Definition in Frage zu stellen,
eval-and-compile
würde auch oberflächlich das gleiche Ergebnis erzielen wie in Stefans richtiger Antwort :Ich bin jedoch kaum mit den Feinheiten der Verwendung vertraut
eval-and-compile
und erwarte außerdem nicht, dass dieser Ansatz in irgendeiner Weise überlegen ist.quelle