如何克服 emacs lisp 闭包缺少局部变量的问题

2024-03-27

我现在正在学习 Emacs Lisp参考手册 http://www.gnu.org/software/emacs/manual/elisp.html和 Common Lisp 来自LISP https://rads.stackoverflow.com/amzn/click/com/0201083191 Book.

来自 Common Lisp 书

>> (setf power-of-two
     (let ((previous-power-of-two 1))
       #'(lambda ()
           (setf previous-power-of-two
             (* previous-power-of-two 2)))))

>> (funcall power-of-two)
2

>> (funcall power-of-two)
4

>> (funcall power-of-two)
8

由于其动态绑定行为,该函数无法在 Emacs Lisp 中运行。

我想知道是否可以在 Emacs Lisp 中实现相同的功能而不引入全局变量?


Update:

至此,Emacs 24已经正式发布,并且支持词法绑定,无需使用lexical-let,当缓冲区局部变量lexical-binding是非零的。也可以看看M-: (info "(elisp) using lexical binding")以及波基塔的回答。


您可以使用lexical-let来自Common Lisp 扩展 http://www.gnu.org/software/emacs/manual/html_mono/cl.html(“CL 包”):

elisp> (require 'cl)
cl
elisp> (setf power-of-two
             (lexical-let ((previous-power-of-two 1))
               #'(lambda ()
                   (setf previous-power-of-two
                         (* previous-power-of-two 2)))))
(lambda
  (&rest --cl-rest--)
  (apply
   (lambda
     (G175638)
     (set G175638
          (*
           (symbol-value G175638)
           2)))
   '--previous-power-of-two-- --cl-rest--))

elisp> (funcall power-of-two)
2
elisp> (funcall power-of-two)
4
elisp> (funcall power-of-two)
8

我还听说过 GNU Emacs 的 lexbind 分支。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何克服 emacs lisp 闭包缺少局部变量的问题 的相关文章

  • emacs shell 命令输出不显示 ANSI 颜色,但显示代码

    当我做M 在我的 emacs 21 4 中 ANSI 代码是字面意思 例如 ls color 0m 0m05420273 pdf 0m 0m100829 Ba o1 pdf 0m 有没有办法同时使用颜色和UTF8 同样的问题已经被之前在SO
  • OS X:如何使命令行脚本显示为帮助应用程序来处理 mailto?

    当用户单击 mailto 链接时 我尝试将 Emacs 配置为我的首选应用程序 Emacs 有这方面的设施 OS X 上的 emacs 23 mailto 链接和调用撰写邮件 https stackoverflow com question
  • 寻求 emacs 中的自动完成功能

    我正在寻找一个插件来为 emacs 中的 c 开发自动完成弹出窗口 我尝试过的是 Cedet Semantics 和自动完成模式 http cx4a org software auto complete index html 只要我已经有几
  • 在 org-agenda 上查看中国/韩国/农历生日?

    我周围有一些人使用农历而不是公历 所以我当前的设置 Birthdays PROPERTIES CATEGORY Birthday END NAME lt 1980 09 09 Thu 1y gt 未能在正确的时间出现org agenda 我
  • 宏扩展可以包含(声明...)表达式吗?

    Common Lisp Hyperspec 规定 宏形式不能扩展为声明 声明表达式必须显示为它们引用的形式的实际子表达式 我对 扩展到 的含义感到困惑 由于显而易见的原因 如下宏将不起作用 defmacro optimize fully d
  • Emacs - 调用时出错(服务器启动)

    我目前在 Windows Vista SP1 中使用 GNU Emacs 23 0 93 1 在我的 emacs 文件中 我调用 server start 这导致消息错误目录 emacs d server 不安全 有没有人见过这个并知道修复
  • 如何让 Emacs 在保存文件时创建中间目录?

    有没有办法在 emacs 中创建文件夹树 类似于 mkdir p in bash 基本上 我希望 emacs 创建所有中间模具 如果它们不存在 当我保存文件时 功能make directory这样做 您的具体问题可能会这样解决 add ho
  • 将列表传播到父代 sexp 中

    在任何 lisp 中是否有一种形式可以在父 sexp 中 传播 列表 喜欢 spread 1 2 3 gt 1 2 3 有两种方法可以做到这一点 哪个更好取决于您最终想要什么 一般来说 您可以使用 inside 反引号 表格如下 被评估以生
  • 当前缓冲区的议程视图

    编辑 解决方案很简单 但对于任何可以解释为什么我的方法不起作用的人来说都是 加分 原点 我想要一个 org mode custom command 来显示仅从当前缓冲区创建的议程 以下代码片段显示了我想要的视图类型 setq org age
  • 在 Emacs Lisp 中检查字符串是否以后缀结尾

    是否有一个函数可以检查字符串是否以某个子字符串结尾 Python 有endswith http docs python org 2 library stdtypes html highlight endswith str endswith
  • 如何让 js2-mode 在 Emacs 中使用空格而不是制表符?

    我在用js2 mode http code google com p js2 mode 在 Emacs 中编辑 Javascript 但我似乎无法让它停止使用制表符而不是空格进行缩进 我的其他模式工作正常 只是遇到 js2 问题 你有 se
  • emacs - 如何在子目录中进行查找文件搜索

    我想为 Emacs 实现类似 Resharper 的 转到文件 功能 当按下上述快捷键时 Resharper 会弹出一个接受通配符字符串的文本框 并显示一个自动完成菜单 其中列出了项目中与该通配符匹配的所有文件 source jetbrai
  • 如何在保存之前对 Emacs 中更改的行执行操作?

    我想添加一个 before save hook 我可以在其中仅对自上次保存以来更改的行执行一些操作 例如 删除尾随空格 检查缩进等 我不想对整个文件执行此操作 并且我知道每个选项都有单独的选项 只是为了删除所有更改行的尾随空格 等等 但我想
  • 如何在 Emacs 中强制绑定?

    我正在尝试绑定
  • 如何在 emacs 中对多种语言进行拼写检查?

    我主要使用 HTML 编写文档emacs作为我的主要编辑 Emacs 允许您使用以下命令以交互方式对当前缓冲区进行拼写检查ispell buffer 由于我在多种语言之间切换 因此我在文件末尾有一个 HTML 注释 指定该文件的主词典和个人
  • 如何在 emacs 中禁用 vc-git?

    我使用 emacs 而不是 sshfs 和 git 存储库 我喜欢使用 git 命令行 因此对于这个项目我不需要启用 vc git 如何防止 vc git 加载 emacs命令 从 vc mode 处理的后端列表中删除 git delete
  • 如何在emacs中获取顶部和底部边距[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 使用 emacs 时如何获得顶部和底部边距 如左右边缘 我发现当我编写或审阅大块文本时 让文本从屏幕顶部开始有点不舒服 我找不到仅顶部和底部边距设置
  • 在 Emacs org-mode 中设置本地文件变量

    在特定的组织模式文件中 我不希望继承标签 我以为放 org use tag inheritance nil因为第一行可以解决问题 但这似乎不起作用 缺少手动执行setq声明 我怎样才能做到这一点 你缺少一个尾随 在标题评论中 尝试这个 or
  • Emacs 关于 python 模式函数的默认提示

    在 python 模式下 有一个名为 py execute region 的函数 它将突出显示的代码区域发送到 Python 缓冲区进行评估 评估后 光标位于 Python 缓冲区中 但我希望它保留在脚本缓冲区中 以便我可以继续生成更多代码
  • Emacs lisp:将字符翻译为标准 ASCII 转录

    我正在尝试编写一个函数 将包含 unicode 字符的字符串转换为某种默认的 ASCII 转录 理想情况下 我想要例如 ngstr m成为Angstroem或者 如果不可能的话 Angstrom 同样地 应该成为a x c 或类似的 Ema

随机推荐