- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
下面的 emacs lisp 文件是关于当 Alice 在她的 init 文件中使用词法绑定(bind)的局部变量 foo
并且 Bob 将 foo
定义为全局特殊变量时会发生什么defvar
在他的 init 文件中,Alice 借用了 Bob 的部分 init 文件代码到她自己的 init 文件中,不知道 foo
会变成特殊的。
;; -*- lexical-binding: t; -*-
;; Alice init file
;; Alice defining alice-multiplier
(defun alice-multiplier-1 (foo)
(lambda (n) (* n foo)))
(defun alice-multiplier-2 (num)
(let ((foo num))
(lambda (n) (* n foo))))
;; Alice using alice-multiplier
(print
(list
:R1 (mapcar (alice-multiplier-1 10) (list 1 2 3))
:R2 (mapcar (alice-multiplier-2 10) (list 1 2 3))))
;; from Bob's code
;; ...
(defvar foo 1000)
;; ...
;; Alice using alice-multiplier
(print
(list
:R3 (mapcar (alice-multiplier-1 10) (list 1 2 3))
:R4 (mapcar (alice-multiplier-2 10) (list 1 2 3))))
输出:
(:R1 (10 20 30) :R2 (10 20 30))
(:R3 (10 20 30) :R4 (1000 2000 3000))
结果R1和R2如我所料。结果 R4 与 defvar 文档一致,尽管 Alice 可能会感到惊讶,除非她阅读 Bob 的代码。
我发现 R3 令人惊讶。为什么R3会这样?
说到 R4,Alice 可以做些什么来保护她的 foo
不被其他人变成特殊的?例如,foo
可能是她在 init 文件或她的 emacs 包之一中使用的词法局部变量,而 (defvar foo "something")
可能在某些她碰巧使用的包,或者 foo
可能是 future 版本的 Emacs 引入的新的特殊变量名称之一。 Alice 是否可以在她的文件中添加一些内容来对 Emacs 说“在这个文件中,foo 应该始终是词法的,即使来自外部的某些代码碰巧使用了同名的特殊变量”?
最佳答案
从“理论”(Scheme/Common Lisp)的角度来看,一旦您启用词法绑定(bind),出于所有实际目的 alice-multiplier-1
和 alice-multiplier- 2
相同。它们行为上的任何差异都是 Emacs Lisp 中的一个错误,应该这样报告。
已编译
如果您将代码(即 2 个 defun
和 ;; -*- lexical-binding: t; -*-
行)放入文件中, emacs-list-byte-compile-and-load
它,然后你可以通过评估这 4 种形式来测试我的说法:
(disassemble 'alice-multiplier-1)
(disassemble 'alice-multiplier-2)
(disassemble (alice-multiplier-1 10))
(disassemble (alice-multiplier-2 10))
您会看到 3 和 4 是相同的,而 1 和 2 有一条指令不同(这应该作为错误报告给 Emacs 维护者,但不会影响行为)。
请注意,没有任何反汇编提及 foo
,这意味着 defvar
将不会影响它们的行为。
一切都很好!
解释
确实,您看到的行为是不正确的; 在 defvar
之后的正确结果是
(:R1 (10000 20000 30000) :R2 (10000 20000 30000))
请report this to the emacs maintainers .
不同???
是的,defvar
确实(并且应该!)影响解释代码的行为,但不会(并且不应该!)影响已编译代码的行为。
没有办法“保护”你的 foo
不被其他人宣称为 special
- 除非在“你的”符号前加上 alice-
.
但是,如果您使用 alice-multiplier-1
定义对文件进行字节编译,编译后的文件甚至不包含 foo
,因此 的 future 声明>foo
不会影响你。
关于emacs - emacs lisp 中词法绑定(bind)和 defvar 之间的奇怪交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17400556/
我通过“emacs --daemon”启动了 emacs 服务器。然后我开了几个客户端。 我想将 .emacs 配置的更改应用于所有客户端,而无需重新启动 emacs 守护程序。这可能吗? 最佳答案
我通过“emacs --daemon”启动了 emacs 服务器。然后我开了几个客户端。 我想将 .emacs 配置的更改应用于所有客户端,而无需重新启动 emacs 守护程序。这可能吗? 最佳答案
我看到了一些关于使 emacs 便携(在 Windows 上)的建议。我的 site-start.el 中有这个: (defvar program-dir (substring data-direct
我是一名狂热的 Vim 用户。我的 Vimrc 有 800 多行。我是一个喜欢定制环境的每个部分的修补匠。 Emacs 似乎更容易配置。所以我尝试一下 Emacs。 当您想要缩小时,请按 Emacs
我是一名狂热的 Vim 用户。我的 Vimrc 有 800 多行。我是一个喜欢定制环境的每个部分的修补匠。 Emacs 似乎更容易配置。所以我尝试一下 Emacs。 当您想要缩小时,请按 Emacs
偶尔在term中使用emacs时模式我会误运行emacs file而不仅仅是打开文件。这将在当前客户端内创建一个嵌套的 emacs 客户端。我的问题是如何只关闭内部客户端? 最佳答案 回答 您应该可以
我一直在慢慢学习 elisp 和 emacs 的新命令,并且一直在稳步构建我的 .emacs。必须保持控制台打开以重复打开和关闭 emacs 实例似乎不是测试的最佳选择,但是从 emacs 中运行 e
我正在寻找一个 emacs 服务器,以便 emacsclients 指定的文件 是相对于 emacsclients 的文件系统而不是服务器的文件系统。例如,如果我设置一个 机器“darkstar”上的
我试图将我所有的 emacs 配置置于版本控制之下,以便在不同的计算机之间轻松切换。实际上我的首选系统是 OSX (10.8.3) 和来自 http://emacsformacosx.com/ 的 e
我正在学习 emacs,我认为使用 emacs 的内置帮助功能开发设施将真正平滑学习击键的学习曲线。 使用 emacs 的内置帮助功能来查找命令名称及其击键的有效过程是什么? 例如,我忘记了关闭框架的
我一直在尝试将 emacs minibuffer 的字体/字体与 emacs 默认字体分开,但没有太多运气。 具体来说,我有兴趣使 minibuffer 字体大小更大以用于 emacs MULE,因为
大约 4 年以来,我一直是一个相当普通的 emacs 用户,但在自定义 emacs 和排除 elisp 故障时,我仍然是新手。最近,我开始自定义 emacs 作为我的 ruby 开发环境,并且我从
我希望 emacs 能够处理一些耗时的任务,而不阻塞输入。为此,我尝试了(其中插入的意思是用耗时的任务来代替) (call-process "emacs" nil 0 nil "--eval=(ins
我的 init.el 中有这个设置 (desktop-save-mode 1) 这很好用,只是我想知道: 如何更改它以将 .emacs.desktop 文件保存到 ~/.emacs.d 而不是 ~/
我是 Emacs 包的作者,偶尔在处理我的包时,我会遇到一个看起来很有用的函数并在我的代码中使用它。然后,在我发布后不久,有人使用旧的 Emacs 版本(但仍然是我想要支持的版本)会报告该功能未定
我用 (message "..some text...") 在我的 init 文件中,在 EMACS 加载时将消息发送到消息缓冲区。这是我查看我刚刚所做的更改导致启动崩溃的快速方法。 但是,我无法找到
简单的问题,我在 Emacs 中使用通用模式进行颜色编码。除了在这种语言中 " 和 ' 可以用来表示字符串之外,下面的代码很好用,如 'this is a string' 或 “这是一个字符串”。默认
有没有办法让我的 Emacs 以预定义的框架作为我附加的屏幕截图开始?我不太熟悉如何在我的 .emacs 脚本中执行此操作... 就这么简单: split-window-horizontally(
在emacs markdown-mode写markdown时,我想让electric-pair-mode自动关闭**bold**和 *italic*成对语法,即当输入一个 * 一秒时 * 应该自动出现
Emacs 是否有一个简单的原始缩进模式可以执行以下操作: 当我转到新行(按 Enter)时,复制上述行 用于缩进的任何空格 当我按 Tab 时,在我按 Tab 的地方插入可以配置的缩进字符(空格/制
我是一名优秀的程序员,十分优秀!