Lors de l'exécution de ce qui suit, j'obtiens une erreur:
(defun caller (func)
(url-retrieve "http://m0smith.freeshell.org/"
(lambda (status) (funcall func))))
(caller (lambda() (message "called")))
Résultat:
error in process filter: Symbol's value as variable is void: func
Quelle est la meilleure façon de résoudre ce problème? Fondamentalement, je dois accepter un rappel ailleurs, l'envelopper dans un autre lambda et l'utiliser comme rappel pour récupérer l'URL.
Si je change l'appelant en
(defun caller (func)
(url-retrieve "http://m0smith.freeshell.org/"
`(lambda (status) (funcall ,func))))
Ça marche. Cependant, je ne peux pas le faire car le func est passé par flycheck et l'expansion de la macro le brise. Pour voir le contexte complet de ce que je fais: https://gist.github.com/m0smith/b5961fda6afd71e82983
FUNC
au-delà, funcall
alors logiquement, vous n'avez pas besoin de liaison lexicale ici. Il n'y a rien de mal à l'utiliser, mais vous n'en avez pas besoin , sauf si du code doit réellement utiliser la variable FUNC
. Si vous n'en avez pas besoin (ce à quoi il ressemble jusqu'à présent), remplacez simplement son occurrence par sa valeur, en utilisant backquote avec une virgule.
lexical-let
. La variable globale lexical-binding
est disponible dans Emacs 24.
lexical-let
ou de définir une variablelexical-binding
. Veuillez clarifier le problème avec la "macro" non affichée.