Emacs 本地到“let”与本地到函数

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

关于Elisp中的局部变量定义,两位受访者都建议
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中创建它的唯一方法。