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

 _____畫情 发布于 2023-01-06 15:34

我从来没有能够提出一种方法来通过函数开始时定义的set-process-sentinel let-bound变量来渗透层次结构- 只有缓冲区局部或全局变量可以穿透它.允许绑定变量可以达到第一个,但是只要它们可以穿透而不会因为被识别而被拒绝 - 在函数开始时定义的 let-bound变量似乎无法穿透开始的部分与.任何人都可以想到一种方法,包括穿透嵌套的哨兵,如下例所示?start-process(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 . . . ))))))))

legoscia.. 7

问题是Emacs Lisp变量绑定默认是动态的.也就是说,在评估函数时,不会在定义函数的环境中查找绑定变量,而是在调用函数的环境中查找.

Emacs 24或更高版本本身支持词法绑定(即函数看到绑定在函数定义周围的变量),但由于它改变了现有代码的语义,因此需要显式启用它.通常,这是通过将文件局部变量设置添加到文件的第一行来完成的.el:

;; -*- lexical-binding: t; -*-

另一种方法是lexical-letcl库中使用.这也适用于早期的Emacs版本.请注意,通过这种方式,您可以明确指定哪些变量应该具有词法绑定,因此代码(例如(lexical-let ((foo foo)) ...)并非罕见)foo是一个需要"转移"到函数中的现有变量.

1 个回答
  • 问题是Emacs Lisp变量绑定默认是动态的.也就是说,在评估函数时,不会在定义函数的环境中查找绑定变量,而是在调用函数的环境中查找.

    Emacs 24或更高版本本身支持词法绑定(即函数看到绑定在函数定义周围的变量),但由于它改变了现有代码的语义,因此需要显式启用它.通常,这是通过将文件局部变量设置添加到文件的第一行来完成的.el:

    ;; -*- lexical-binding: t; -*-
    

    另一种方法是lexical-letcl库中使用.这也适用于早期的Emacs版本.请注意,通过这种方式,您可以明确指定哪些变量应该具有词法绑定,因此代码(例如(lexical-let ((foo foo)) ...)并非罕见)foo是一个需要"转移"到函数中的现有变量.

    2023-01-06 15:36 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有