gpt4 book ai didi

emacs - 使用 let-bound 变量穿透 `set-process-sentinel` 层次结构

转载 作者:行者123 更新时间:2023-12-04 13:50:11 25 4
gpt4 key购买 nike

我从来没有想出一个方法来穿透 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com