elisp:从内部函数捕获变量

2024-05-17

我可爱的功能:

(defun f (x)
  (lambda (y) (+ x y)))

然后,我期望这样:

(funcall (f 2) 2)

返回 4。但是可惜,我得到了这个:

Debugger entered--Lisp error: (void-variable x)

那么如何从内部函数中捕获变量呢?


您已经被 elisp 的动态作用域所困扰。这xlambda 中指的是变量x这是在调用 lambda 时的范围内(并且因为在这种情况下没有x当你调用它时,你会得到一个错误),而不是x当您创建 lambda 时,它就在范围内。

在 elisp 中模拟词汇闭包的一些方法在EmacsWiki 上的此页面 http://www.emacswiki.org/emacs/FakeClosures.

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

elisp:从内部函数捕获变量 的相关文章

  • 广告激活有什么作用?

    In an answer https stackoverflow com a 8129994 357313 我注意到 Align with spaces only defadvice align regexp around align re
  • 使用projectile在.dir-locals中设置flycheck-clang-include-path

    尝试设置 Flycheck clang include path 而无需包含项目的完整路径 包括使用弹丸的目录 但我收到错误 所以这有效 nil company clang arguments home user Downloads pro
  • 在 Emacs Lisp 中插入整月的日期

    我正在 Emacs Lisp 中进行一些编程 但我不完全确定如何处理某些事情 我正在尝试插入一整月的日期 每个日期都在一个新行上 如下列表所示 January 2009 年 1 月 1 日星期一 02 01 09 星期二 03 01 09
  • emacs lisp 中的 let 和 flet

    我不知道你是否会称其为规范公式 但为了绑定本地函数 GNU 手册建议我使用 flet defun adder with flet x flet f x x 3 f x 然而 我偶然尝试了 在玩了一会儿Scheme之后 下面的表达式 其中我使
  • 防止 Emacs 滚动到缓冲区末尾

    当我用鼠标或滚动条滚动到缓冲区末尾时 是否可以添加任何内容到 emacs 文件中 以防止 emacs 添加新行 我已经有了 setq next line add newlines nil 但这似乎只适用于我用键盘移动时 我对此主题进行了多次
  • 列出 emacs 中的所有顶级全局变量

    主要是为了我自己的启发 我尝试列出当前 Emacs 会话中加载的所有全局变量 我正在考虑做的是生成一个包含列出的所有功能的 HTML 文件 当然 定义函数 var 等的文件也很有用 emacs 中已经内置了一些可以提供帮助的东西吗 L 沿着
  • 在 emacs python-mode 中不正确地退出缩进

    我正在使用 Emacs python 模式 我在我的中使用它来调用它 emacs add to list load path emacs python mode el 6 0 3 autoload python mode python mo
  • 如何在组织模式下匹配/解析任务结束时的注释

    我正在寻找一种与我所说的 注释 相匹配的方法 注释 是组织任务的最后一行 或一组行 上面写着 These are the notes of the task 我真的写了一篇long正则表达式may完成这项工作 但我希望 org mode 已
  • Emacs 插入居中注释块

    我想为 emacs 创建一个宏 它将插入一个带有一些居中文本的乳胶注释块 例如 Comment 1 Comment 2 Commenttext 3 这可
  • emacs isearch 整个缓冲区的延迟突出显示

    isearch 的默认行为是突出显示当前窗口中匹配的世界 我怎样才能改变这种行为 让它突出显示整个当前缓冲区中匹配的世界 也许您正在寻找高亮 命令 以便在执行其他操作时在整个缓冲区中突出显示内容 M shC h lists Global B
  • 如何获得基本的 App<->Emacs 集成?

    有很多应用程序将 Emacs 与外部进程集成 我首先想到的是 GDB 我可以从 emacs 控制 GDB 然后在屏幕上获得反馈 我想通过我的应用程序朝这个方向做一些事情 这就是我想要的 在我和 emacs 之间建立连接 我可能会启动一个新的
  • 如何使用 emacs/elisp 获取当前缓冲区信息的开始/结束?

    我有以下代码运行以范围输入的Figlet 如何修改此代码以检查 b 或 e 是否未指定 使 b 位于当前缓冲区的开头 e 位于当前缓冲区的结尾 defun figlet region optional b e interactive r s
  • 在 Emacs Lisp 中检查字符串是否以后缀结尾

    是否有一个函数可以检查字符串是否以某个子字符串结尾 Python 有endswith http docs python org 2 library stdtypes html highlight endswith str endswith
  • 将 CSV 导入组织模式属性

    我想将 CSV 导入组织模式 其他人已经询问过如何将 CSV 导入组织模式表 这不是我想做的 我需要将 CSV 导入到组织模式属性 例如 像这样的 CSV Name Tel Mobile Fax John 11111 22222 33333
  • Emacs 关于 python 模式函数的默认提示

    在 python 模式下 有一个名为 py execute region 的函数 它将突出显示的代码区域发送到 Python 缓冲区进行评估 评估后 光标位于 Python 缓冲区中 但我希望它保留在脚本缓冲区中 以便我可以继续生成更多代码
  • 并排镜像两个打开的缓冲区中的文件位置

    我试图在 emacs 中找到一个包 函数 它可以并排打开两个文件 使其位于同一行位置 镜像正在移动的缓冲区的移动 这意味着 对于并排打开的两个缓冲区 在其中一个缓冲区中移动 向上 向下翻页 移动光标等 将在另一个缓冲区中进行相同的移动 更具
  • 为什么在 emacs-lisp 中的函数参数之前使用#'?

    我熟悉 Emacs Lisp 但不熟悉 Common 或任何其他 Lisp 一些 Lisp 程序员建议 例如emacs 的基本功能 https stackoverflow com questions 17076646 a basic fun
  • Emacs -- 修改 `fill-column-indicator.el` 以在空白处显示

    我正在寻求一些帮助来修改fill column indicator el由 Alp Aker 设计 以便垂直线在空白处可见 无论空白模式是否处于活动状态 以下是该库的 Github 存储库的链接 https github com alpak
  • 如何在Emacs Lisp中脱离maphash?

    我需要提前退出maphash当我找到我要找的东西时 defun find in hash str hash let match nil maphash lambda key value if string prefix p str key
  • 字节编译宏时出现“返回的值未使用”警告

    为什么对以下内容进行字节编译会产生警告 defmacro foomacro shiftcode defun foo optional arg interactive concat shiftcode p message arg is i a

随机推荐