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

标签 emacs elisp lexical-scope

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

相关文章:

emacs - 组织模式时钟表和图表

java - JDEE 值得使用吗?

r - 为什么 R 不能通过词法范围找到参数的值?

emacs - 避免字体锁定干扰评论内

regex - 用双破折号替换数字之间的单破折号

emacs - 使用书签打开文件但始终在给定位置

emacs - 如何在Emacs模式行中显示文件的路径?

emacs - 在 elisp 函数上添加钩子(Hook)

flutter - dart 中的词法作用域是什么?

javascript - 当提供箭头函数时,Array.prototype.forEach 中的 'this' 如何解析?