Al ejecutar lo siguiente me sale un error:
(defun caller (func)
(url-retrieve "http://m0smith.freeshell.org/"
(lambda (status) (funcall func))))
(caller (lambda() (message "called")))
Resultado:
error in process filter: Symbol's value as variable is void: func
¿Cuál es la mejor manera de resolver este problema? Básicamente, necesito aceptar una devolución de llamada de otro lugar, envolverla en otra lambda y usarla como devolución de llamada para recuperar URL.
Si cambio la llamada a
(defun caller (func)
(url-retrieve "http://m0smith.freeshell.org/"
`(lambda (status) (funcall ,func))))
funciona. Sin embargo, no puedo hacer esto ya que flycheck pasa la función y la expansión de macro la rompe. Para ver el contexto completo de lo que estoy haciendo: https://gist.github.com/m0smith/b5961fda6afd71e82983
flycheck
lexical-scoping
M Smith
fuente
fuente
lexical-let
o configurar variableslexical-binding
. Por favor, aclare cuál es el problema con la "macro" no mostrada.FUNC
más allá delfuncall
lógico, entonces no necesita enlace léxico aquí. No hay nada de malo en usarlo, pero no lo necesita , a menos que algún código realmente necesite hacer uso de la variableFUNC
. Si no lo necesita (que es lo que parece hasta ahora), simplemente reemplace su ocurrencia por su valor, utilizando comillas y comillas.lexical-let
. La variable globallexical-binding
está disponible en Emacs 24.Respuestas:
Puede lograr esto localmente usando cl.el's lexical-let :
Para ser explícito como dice la ayuda:
Ahora puede obtener el mismo efecto habilitando el enlace léxico que se agregó en Emacs 24.1. Esta es una variable local del búfer que se puede configurar y habilitará los cierres léxicos en todo el código del búfer. Entonces su búfer se vería así:
fuente
my-test-caller: Symbol's function definition is void: lexical-let
en mis emacs: GNU Emacs 24.4.1 (x86_64-w64-mingw32) `de 2014-10-20 en KAELlexical-let
se define encl-macs.el
. Entonces(eval-when-compile '(require 'cl))
cl.el
en tiempo de ejecución, solo para esto.lexical-let
es una macro, por lo que es suficiente requerirla en tiempo de compilación.lexical-binding
. Flycheck no es compatible con Emacs 23 de todos modos, por lo que no tiene sentido tratar de ser compatible con él.Habilite
lexical-binding
para su biblioteca, conM-x add-file-local-variable-prop-line RET lexical-binding RET t
.Por favor no use
lexical-let
como lo sugiere la otra respuesta. Flycheck en sí mismo no es compatible con Emacs 23, por lo que no tiene sentido tratar de mantener la compatibilidad con Emacs 23 en su propio código.fuente
lexical-binding
no hay necesidad de un enlace adicional, porque el argumento en sí mismo tiene un alcance léxico. Además,lexical-binding
crea cierres verdaderos, mientras quelexical-let
usa símbolos no intercalados para emular el enlace léxico.let
vinculación dinámica de variables indefinidas. Pero, de nuevo, Flycheck es para Emacs 24 de todos modos, por lo que no estamos hablando de código heredado.