Emacs 本地到“let”与本地到函数
关于Elisp中的局部变量定义,两位受访者都建议Emacs 本地到“let”与本地到函数,emacs,scope,elisp,Emacs,Scope,Elisp,关于Elisp中的局部变量定义,两位受访者都建议let是合适的,并强调不会将变量定义为函数的局部变量。该变量仅对let语句是局部变量 本地到let和本地到函数的区别是什么?是否有另一种结构可以定义函数范围的变量 使用let语句的函数如下所示: (defun test-search (string) "Searches for STRING in document. Displays message 'Found!' or 'Not found...'. Places point after
let
是合适的,并强调不会将变量定义为函数的局部变量。该变量仅对let
语句是局部变量
本地到let
和本地到函数的区别是什么?是否有另一种结构可以定义函数范围的变量
使用let
语句的函数如下所示:
(defun test-search (string)
"Searches for STRING in document.
Displays message 'Found!' or 'Not found...'. Places point after word
when found; fixed otherwise."
(interactive "sEnter search word: ")
(let ((found (save-excursion
(beginning-of-buffer)
(search-forward string nil t nil))))
(if found
(progn
(goto-char found)
(message "Found!"))
(message "Not found..."))))
由于在示例中,
let
构成了函数的整个主体,因此“要let的局部变量”与“函数的局部变量”是无法区分的
因此,没有单独的构造将变量引入函数的局部let
就是这种构造,它可以用于整个函数中有效的变量,也可以用于小子集中有效的变量,具体取决于放置let
的位置
本地出租和本地功能之间的区别是什么
这个问题有点容易解释,但我在这里解释“函数的局部性”,意思是不是函数的一部分的代码看不到变量,默认情况下,在Emacs中,对于let
绑定(或者实际上对于一般的变量绑定)来说,情况并非如此
要详细理解,您需要理解动态绑定和词汇绑定之间的区别(其他地方对此有很好的解释,所以您可以自己跟进)。然而,为了简单地说明差异,请考虑以下功能:
(defun func1()
(let((foo 42))
(二)
(defun func2()
(bound-and-true-p-foo))
func1
的结果是func2
的结果,这又取决于变量foo
对后一个函数是否可见
在默认动态绑定下,调用func1
将返回42
,因为foo
的绑定范围是包含对func2
的调用的let
的持续时间
在词法绑定下,调用func1
将返回nil
,因为foo
(未被声明为动态)有一个绑定是func1
的本地绑定,因此func2
无法看到它)
在上面的例子中,当谈到“函数的局部性”时,我实际上有点误导,因为foo
绑定的范围严格来说是let
表单的范围,而不是函数的范围。但是,该行为不仅限于let
绑定,因此我们还可以使用以下示例,比较动态绑定和词法绑定下(func3 42)
的结果:
(defun func3(foo)
(四)
(defun func4()
(bound-and-true-p-foo))
让
创建一个局部变量。这是在elisp中创建它的唯一方法。