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
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.