2017-04-07 58 views
4

another question关于elisp的局部变量的定义,无论受访者提醒,let是恰当的,强调它不会定义变量是本地的功能。该变量仅限于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...")))) 
+2

'let'创建一个局部变量。这是在elisp中创建它的唯一方法。 – sds

回答

4

由于let,使你的函数的整个身体在你的榜样,你的“局部变量,让”从“局部变量别无二致功能”。

因此,没有没有单独的构造来引入局部函数的变量。 let就是那个构造,它可以用于在整个函数中有效的变量,也可以用于在小子集上有效的变量,具体取决于您放置let的位置。

0

本地函数与局部函数之间的区别是什么?

的问题是解释微张,但我在这里解释“本地功能”的理解是,代码是不是函数的部分不能看到变量,并在Emacs 默认对于let绑定(或实际上对于一般的可变绑定)来说并非如此。

要详细了解您需要了解动态之间的差异结合词汇结合(也有这不错的解释在其他地方,这样你就可以跟进自己)。为了简单地演示不同,但是,请考虑以下功能:

(defun func1() 
    (let ((foo 42)) 
    (func2))) 

(defun func2() 
    (bound-and-true-p foo)) 

func1结果是func2的结果,而这又取决于变量foo是否是后者的功能可见。

在默认的动态绑定,调用func1会返回42,因为foo绑定的范围是let,其中包含了调用func2的持续时间。

在词法绑定,调用func1会返回nil,因为foo(尚未否则被宣布动态)具有约束力的是本地func1,因此func2不能看到它)。

我其实是有些误导相对于上面的例子讲“本地功能”时,作为foo结合的范围是严格的let形式的范围,而不是功能的范围。该行为不仅限于let绑定的,所以我们也可以使用下面的例子中,在动态和词汇结合的(func3 42)结果比较:

(defun func3 (foo) 
    (func4)) 

(defun func4() 
    (bound-and-true-p foo))