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
FUNC
más allá del funcall
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 variable FUNC
. 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 global lexical-binding
está disponible en Emacs 24.
lexical-let
o configurar variableslexical-binding
. Por favor, aclare cuál es el problema con la "macro" no mostrada.