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
flycheck
lexical-scoping
M Smith
la source
la source
lexical-let
ou de définir une variablelexical-binding
. Veuillez clarifier le problème avec la "macro" non affichée.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 variableFUNC
. 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 globalelexical-binding
est disponible dans Emacs 24.Réponses:
Vous pouvez y parvenir localement en utilisant le lexical-let de cl.el :
Pour être explicite comme le dit l'aide:
Vous pouvez maintenant obtenir le même effet en activant la liaison lexicale qui a été ajoutée dans Emacs 24.1. Il s'agit d'une variable locale de tampon qui peut être définie et permettra des fermetures lexicales sur tout le code du tampon. Ainsi, votre tampon ressemblerait à ceci:
la source
my-test-caller: Symbol's function definition is void: lexical-let
dans mes emacs: GNU Emacs 24.4.1 (x86_64-w64-mingw32) `du 2014-10-20 sur KAELlexical-let
est défini danscl-macs.el
. Donc(eval-when-compile '(require 'cl))
cl.el
au moment de l'exécution, juste pour cela.lexical-let
est une macro, il suffit donc de l'exiger au moment de la compilation.lexical-binding
. Flycheck ne prend pas en charge Emacs 23 de toute façon, il est donc inutile d'essayer d'être compatible avec lui.Activer
lexical-binding
pour votre bibliothèque, avecM-x add-file-local-variable-prop-line RET lexical-binding RET t
.Veuillez ne pas utiliser
lexical-let
comme suggéré par l'autre réponse. Flycheck lui-même n'est pas compatible avec Emacs 23, il est donc inutile d'essayer de maintenir la compatibilité Emacs 23 dans votre propre code.la source
lexical-binding
il n'y a pas besoin d'une liaison supplémentaire, car l'argument lui-même a une portée lexicale. De plus,lexical-binding
crée de véritables fermetures, alors qu'illexical-let
utilise des symboles non internes pour émuler la liaison lexicale.let
liaison dynamique de variables non définies. Mais encore une fois, Flycheck est pour Emacs 24 de toute façon, nous ne parlons donc pas de code hérité.