Quando eseguo quanto segue ricevo un errore:
(defun caller (func)
(url-retrieve "http://m0smith.freeshell.org/"
(lambda (status) (funcall func))))
(caller (lambda() (message "called")))
Risultato:
error in process filter: Symbol's value as variable is void: func
Qual è il modo migliore per risolvere questo problema? Fondamentalmente ho bisogno di accettare un callback da qualche altra parte, avvolgerlo in un altro lambda e usarlo come callback per recuperare l'URL.
Se cambio chiamante a
(defun caller (func)
(url-retrieve "http://m0smith.freeshell.org/"
`(lambda (status) (funcall ,func))))
Funziona. Tuttavia, non posso farlo poiché il flycheck viene superato da func e l'espansione della macro lo interrompe. Per vedere il contesto completo di ciò che sto facendo: https://gist.github.com/m0smith/b5961fda6afd71e82983
FUNC
oltre a quello funcall
logico, qui non è necessario il legame lessicale. Non c'è niente di sbagliato nell'usarlo, ma non ne hai bisogno , a meno che un po 'di codice non abbia effettivamente bisogno di usare la variabile FUNC
. Se non ti serve (che è quello che sembra, finora), sostituisci semplicemente la sua occorrenza con il suo valore, usando il backquote con la virgola.
lexical-let
. La variabile globale lexical-binding
è disponibile in Emacs 24.
lexical-let
o l'impostazione della variabilelexical-binding
. Si prega di chiarire qual è il problema con la "macro" non visualizzata.