讓我們考慮以下功能:
(defun test (x)
"X."
(request "http://example.com"
:parser 'json-read
:complete (cl-function
(lambda (&key response &allow-other-keys)
(message "%s" x)))))
(defun test2 (x)
"X."
(funcall (cl-function (lambda (z) (message "%s" z))) x))
呼叫(test2 3)作業正常并產生所需的訊息。(test 3)但是,呼叫失敗并出現以下錯誤:
error in process sentinel: let*: Symbol’s value as variable is void: x
error in process sentinel: Symbol’s value as variable is void: x
我的猜測是,這request是一個宏對變數作用域做了一些奇怪的事情。不幸的是,檔案沒有提到這樣的事情。有沒有辦法克服它?
uj5u.com熱心網友回復:
request可能是一個普通的功能。
問題是lambda您傳遞給它的不是立即呼叫,而是保存并稍后呼叫:
(defun make-function (x)
(lambda () (message "received %s" x)))
=> make-function
(defconst f (make-function 3))
=> f
(funcall f)
=> Lisp error: (void-variable x)
x該make-function界限不再存在。
這是因為默認情況下 Emacs 使用動態系結,并且您需要詞法系結來獲得您想要的行為。
如果你添加
;; -*- lexical-binding:t -*-
到檔案的第一行,它將使用詞法系結進行編譯received 3,上面的代碼將產生訊息而不是錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/523720.html
