Wenn ich Folgendes ausführe, erhalte ich eine Fehlermeldung:
(defun caller (func)
(url-retrieve "http://m0smith.freeshell.org/"
(lambda (status) (funcall func))))
(caller (lambda() (message "called")))
Ergebnis:
error in process filter: Symbol's value as variable is void: func
Was ist der beste Weg, um dieses Problem zu lösen? Grundsätzlich muss ich einen Rückruf von einem anderen Ort annehmen, ihn in ein anderes Lambda einwickeln und diesen als Rückruf zum Abrufen von URLs verwenden.
Wenn ich den Anrufer auf wechsle
(defun caller (func)
(url-retrieve "http://m0smith.freeshell.org/"
`(lambda (status) (funcall ,func))))
Es klappt. Ich kann dies jedoch nicht tun, da die Funktion per Flycheck übergeben wird und die Makroerweiterung dies unterbricht. Um den vollständigen Kontext meiner Arbeit zu sehen: https://gist.github.com/m0smith/b5961fda6afd71e82983
flycheck
lexical-scoping
M Smith
quelle
quelle
lexical-let
, eine Variable zu verwenden oder einzustellenlexical-binding
. Bitte machen Sie deutlich, wo das Problem mit dem nicht angezeigten "Makro" liegt.FUNC
über das hinausfuncall
gibt , benötigen Sie hier logischerweise keine lexikalische Bindung. Es ist nichts Falsches daran, es zu verwenden, aber Sie brauchen es nicht, es sei denn, ein Code muss tatsächlich die Variable verwendenFUNC
. Wenn Sie es nicht benötigen (so sieht es bisher aus), ersetzen Sie es einfach durch seinen Wert, indem Sie backquote durch Komma verwenden.lexical-let
. Die globale Variablelexical-binding
ist in Emacs 24 verfügbar.Antworten:
Sie können dies lokal erreichen, indem Sie das lexikalische Zeichen von cl.el verwenden :
Um explizit zu sein, wie die Hilfe sagt:
Jetzt können Sie den gleichen Effekt erzielen, indem Sie die in Emacs 24.1 hinzugefügte lexikalische Bindung aktivieren . Dies ist eine lokale Puffervariable, die festgelegt werden kann und lexikalische Schließungen für den gesamten Code im Puffer ermöglicht. Ihr Puffer würde also so aussehen:
quelle
my-test-caller: Symbol's function definition is void: lexical-let
in meinen Emacs: GNU Emacs 24.4.1 (x86_64-w64-mingw32) `vom 20.10.2014 auf KAELlexical-let
ist definiert incl-macs.el
. Also(eval-when-compile '(require 'cl))
cl.el
Laufzeit benötigen , nur dafür.lexical-let
ist ein Makro, daher reicht es aus, es zur Kompilierungszeit zu benötigen.lexical-binding
. Flycheck unterstützt Emacs 23 sowieso nicht, daher macht es keinen Sinn, zu versuchen, damit kompatibel zu sein.Aktivieren Sie
lexical-binding
für Ihre Bibliothek mitM-x add-file-local-variable-prop-line RET lexical-binding RET t
.Bitte verwenden Sie nicht
lexical-let
wie in der anderen Antwort vorgeschlagen. Flycheck selbst ist nicht mit Emacs 23 kompatibel, daher macht es keinen Sinn, die Emacs 23-Kompatibilität in Ihrem eigenen Code beizubehalten.quelle
lexical-binding
besteht keine Notwendigkeit für eine zusätzliche Bindung, weil das Argument selbst ist lexikalische. Darüber hinauslexical-binding
werden echte Verschlüsse erstellt, während nichtlexical-let
interinierte Symbole verwendet werden, um die lexikalische Bindung zu emulieren.let
dynamisch Bindung nicht definierte Variablen. Aber auch hier ist Flycheck sowieso für Emacs 24, also sprechen wir nicht über Legacy-Code.