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
FUNC
über das hinaus funcall
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 verwenden FUNC
. 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 Variable lexical-binding
ist in Emacs 24 verfügbar.
lexical-let
, eine Variable zu verwenden oder einzustellenlexical-binding
. Bitte machen Sie deutlich, wo das Problem mit dem nicht angezeigten "Makro" liegt.