Khi thực hiện như sau tôi gặp lỗi:
(defun caller (func)
(url-retrieve "http://m0smith.freeshell.org/"
(lambda (status) (funcall func))))
(caller (lambda() (message "called")))
Kết quả:
error in process filter: Symbol's value as variable is void: func
Cách tốt nhất để giải quyết vấn đề này là gì? Về cơ bản tôi cần chấp nhận một cuộc gọi lại từ một nơi khác, bọc nó trong một lambda khác và sử dụng nó như là cuộc gọi lại để lấy lại url.
Nếu tôi đổi người gọi thành
(defun caller (func)
(url-retrieve "http://m0smith.freeshell.org/"
`(lambda (status) (funcall ,func))))
nó hoạt động Tuy nhiên, tôi không thể làm điều này vì func đang được thông qua flycheck và việc mở rộng macro phá vỡ nó. Để xem toàn bộ bối cảnh của những gì tôi đang làm: https://gist.github.com/m0smith/b5961fda6afd71e82983
FUNC
vượt quá funcall
thì về mặt logic, bạn không cần ràng buộc từ vựng ở đây. Không có gì sai khi sử dụng nó, nhưng bạn không cần nó, trừ khi một số mã thực sự cần sử dụng biến FUNC
. Nếu bạn không cần nó (giống như hiện tại), thì chỉ cần thay thế sự xuất hiện của nó bằng giá trị của nó, sử dụng backquote bằng dấu phẩy.
lexical-let
. Biến toàn cầu lexical-binding
có sẵn trong Emacs 24.
lexical-let
hoặc cài đặt biếnlexical-binding
. Vui lòng làm rõ vấn đề với "macro" không hiển thị.