Questions tagged «lexical-scoping»

3
为什么“ let”在词法范围内更快?
在阅读dolist宏的源代码时,我遇到了以下注释。 ;; 这不是一个可靠的测试,但这并不重要,因为两种语义都可以接受,其中一种在动态作用域下会更快,而另一种在词法作用域下会更快(并且具有更清晰的语义)。 其中提到了此代码段(为清楚起见,我对其进行了简化)。 (if lexical-binding (let ((temp list)) (while temp (let ((it (car temp))) ;; Body goes here (setq temp (cdr temp))))) (let ((temp list) it) (while temp (setq it (car temp)) ;; Body goes here (setq temp (cdr temp))))) 看到let循环中使用了某种形式,这让我感到惊讶。我曾经认为,与setq在相同的外部变量上重复使用相比,这比较慢(就像上面第二种情况一样)。 我本可以将其视为无用,如果不是在其上方的注释中明确表示,这比替代方法(带有词法绑定)要快。所以...为什么呢? 为什么上面的代码在词法绑定和动态绑定方面的性能有所不同? 为什么let用词法形式更快?

1
为什么setq和set quote在具有词法作用域的让界变量上有不同的作用?
我的一个扩展程序中存在一个错误,最终导致该错误是由于set我没有按预期工作: ;; -*- lexical-binding: t -*- (let ((a nil)) (setq a t) (print a)) (let ((a nil)) (set 'a t) (print a)) 与emacs -Q --batch -l temp.el打印一起运行时: t nil 这对我来说似乎很奇怪。我的印象(setq a b)是速记(set 'a b)。这是怎么回事?

3
用词法绑定的let内部的Defun给出字节编译警告“该函数未知”
我想通过使用带有词法绑定的defun内部let来创建闭包来获得静态变量的效果。但是,当字节编译文件时,出现警告。我是在做错什么,否则,是否有办法抑制此警告? 我创建了一个MCVE: ;; -*- lexical-binding: t -*- (let ((count 0)) (defun increase-count () (interactive) (setq count (1+ count)) (message "Count is: %d" count)) ;; The warning happens here. (increase-count)) 代码按预期工作:函数increase-count打印出“ Count is:n”,其中n在每次调用时都会增加。但是,当字节编译此文件时,出现以下警告: In end of data: mcve.el:11:1:Warning: the function ‘increase-count’ is not known to be defined. 在我看来,increase-count应该始终在let块末尾调用它之前定义它。不是这样吗?

1
为缓冲区启用词法绑定的潜在陷阱是什么?
这是通过讨论启发词汇结合 VS 词汇,让在此问题。由于词法绑定使您能够使用有用的闭包,人们可能已经习惯于其他语言(如JavaScript),为什么不一直启用它呢? 假定与旧版Emacsen的向后兼容性无关紧要,如果在旧版代码缓冲区中启用它,您应该寻找什么陷阱?

1
当某些库可能因设计而丢失时,处理“警告:分配给自由变量”
我的模式的字节编译: (defun dict-setup-expansions () "Add `dict-mode' specific expansions." (set (make-local-variable 'er/try-expand-list) (list #'dict-mark-article))) 给出警告: Warning: assignment to free variable `er/try-expand-list' 这是正常情况,因为er/try-expand-list是在externa中定义的;库expand-region位于http://elpa.gnu.org 我的模式将扩展名注册到expand-region库,但是可以在没有expand-region模式的情况下运行我的模式。 我认为处理警告的正确方法是添加声明: (defvar er/try-expand-list) defvar 文档说: The `defvar' form also declares the variable as "special", so that it is always dynamically bound even if `lexical-binding' is t. 我用-*- lexical-binding: …

1
如何确定宏的变量作用域?
采取以下示例宏(在中定义)macro.el。 (defmacro some-macro (&rest body) `(let ((some-variable 1)) ,@body)) 并采取以下功能,在不同的文件中定义,function.el。 (defun some-function () (some-macro (do-something))) 当function.el被字节编译,将some-variable在词汇或动态绑定的约束? 我了解这取决于文件是否使用-*- lexical-binding: t; -*-,因此我的问题专门针对以下情况: 如果function.el使用词法绑定,但macro.el不使用。 如果macro.el使用词法绑定,但function.el不使用。 如果some-var在内部声明了全局变量(使用defvar),会有所不同function.el吗?如果是这样,我在那里的情况特别感兴趣也没有。

3
为什么在没有initvalue的情况下defvar作用域的工作方式有所不同?
假设我有一个名为elisp-defvar-test.el包含的文件: ;;; elisp-defvar-test.el --- -*- lexical-binding: t -*- (defvar my-dynamic-var) (defun f1 (x) "Should return X." (let ((my-dynamic-var x)) (f2))) (defun f2 () "Returns the current value of `my-dynamic-var'." my-dynamic-var) (provide 'elisp-dynamic-test) ;;; elisp-defvar-test.el ends here 我加载此文件,然后进入暂存缓冲区并运行: (setq lexical-binding t) (f1 5) (let ((my-dynamic-var 5)) (f2)) (f1 5)按预期返回5,表示的主体按预期f1被my-dynamic-var视为动态范围变量。但是,最后一种形式给出的变量变量为void my-dynamic-var,表明该变量使用词法作用域。似乎与的文档不一致,该文档defvar说: 该defvar表格还声明变量为“特殊”,所以它始终是动态即使势必lexical-binding为t。 …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.