Saat menjalankan yang berikut ini saya mendapatkan kesalahan:
(defun caller (func)
(url-retrieve "http://m0smith.freeshell.org/"
(lambda (status) (funcall func))))
(caller (lambda() (message "called")))
Hasil:
error in process filter: Symbol's value as variable is void: func
Apa cara terbaik untuk mengatasi masalah ini? Pada dasarnya saya perlu menerima panggilan balik dari tempat lain, membungkusnya dengan lambda lain dan menggunakannya sebagai panggilan balik untuk mengambil-url.
Jika saya mengubah penelepon ke
(defun caller (func)
(url-retrieve "http://m0smith.freeshell.org/"
`(lambda (status) (funcall ,func))))
berhasil. Namun, saya tidak bisa melakukan ini karena func sedang dilewati oleh flycheck dan ekspansi makro memecahnya. Untuk melihat konteks lengkap dari apa yang saya lakukan: https://gist.github.com/m0smith/b5961fda6afd71e82983
FUNC
luar funcall
maka secara logis Anda tidak perlu mengikat leksikal di sini. Tidak ada yang salah dengan menggunakannya, tetapi Anda tidak memerlukannya , kecuali beberapa kode benar-benar perlu menggunakan variabel FUNC
. Jika Anda tidak membutuhkannya (yang terlihat seperti sejauh ini), maka ganti saja kemunculannya dengan nilainya, menggunakan backquote dengan koma.
lexical-let
. Variabel global lexical-binding
tersedia dalam Emacs 24.
lexical-let
atau menyetel variabellexical-binding
. Harap jelaskan apa masalahnya dengan "makro" yang tidak ditampilkan.