我从来没有想出一个方法来穿透 set-process-sentinel
带有约束变量的层次结构在函数的开头定义 -- 只有局部缓冲区或全局变量可以穿透它。 let-bound 变量可以到达第一个 start-process
, 但这是他们可以穿透而不会因为无法识别而被拒绝的程度——让绑定(bind)变量在函数的开头定义 似乎无法穿透以 (lambda (p e) . . .
开头的部分.谁能想到一个办法,包括穿透嵌套 像下面例子中的哨兵?
(set-process-sentinel
(start-process
"my-process-name-one"
"*OUTPUT-BUFFER*"
"/path/to/executable"
"argument-one"
"argument-two"
"argument-three")
(lambda (p e) (when (= 0 (process-exit-status p))
(set-process-sentinel
(start-process
"my-process-name-two"
nil ;; example of not using an output buffer
"/path/to/executable"
"argument-one"
"argument-two"
"argument-three")
(lambda (p e) (when (= 0 (process-exit-status p))
(set-process-sentinel
(start-process . . . ))))))))
最佳答案
问题是 Emacs Lisp 变量绑定(bind)默认是动态的。也就是说,当一个函数被求值时,绑定(bind)变量不是在定义函数的环境中查找,而是在调用函数的环境中查找。
Emacs 24 或更高版本 native 支持词法绑定(bind)(即函数看到绑定(bind)在函数定义周围的变量),但由于它改变了现有代码的语义,因此您需要显式启用它。通常这是通过将文件局部变量设置添加到 .el
的第一行来完成的。文件:
;; -*- lexical-binding: t; -*-
另一种选择是使用
lexical-let
来自 cl
图书馆。这也适用于早期的 Emacs 版本。请注意,通过这种方式,您可以显式指定哪些变量应该具有词法绑定(bind),所以像 (lexical-let ((foo foo)) ...)
这样的代码并不少见— foo
是一个现有变量,需要“转移”到函数中。
关于emacs - 使用 let-bound 变量穿透 `set-process-sentinel` 层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24548536/