Ao executar o seguinte, recebo um erro:
(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
Qual é a melhor maneira de resolver este problema? Basicamente, preciso aceitar um retorno de chamada de outro lugar, envolvê-lo em outro lambda e usá-lo como retorno de chamada para recuperar url.
Se eu mudar o chamador para
(defun caller (func)
(url-retrieve "http://m0smith.freeshell.org/"
`(lambda (status) (funcall ,func))))
funciona. No entanto, não posso fazer isso, pois o func está sendo passado pelo flycheck e a expansão de macro o interrompe. Para ver o contexto completo do que estou fazendo: https://gist.github.com/m0smith/b5961fda6afd71e82983
FUNC
além do funcall
que logicamente, você não precisará de ligação lexical aqui. Não há nada errado em usá-lo, mas você não precisa , a menos que algum código realmente precise fazer uso da variável FUNC
. Se você não precisar dele (como é a aparência até agora), substitua a ocorrência pelo valor, usando aspas por vírgula.
lexical-let
. A variável global lexical-binding
está disponível no Emacs 24.
lexical-let
ou configuração de variávellexical-binding
. Por favor, esclareça qual é o problema com a "macro" não mostrada.