Emacs lisp。一个函数无法访问另一个函数中的变量

时间:2016-10-14 16:15:39

标签: elisp

emacs lisp中的代码:

 

(defun test-sub-fun-var() (message "SUB test-sub-fun-var: my-local-var: %s" my-local-var) )

(defun test-main() (message "\nSTART test-main") (let ( (my-local-var) ) (setq my-local-var "MY LOCAL VARIABLE VALUE") (message "MAIN my-local-var: %s" my-local-var) (test-sub-fun-var) ) (message "FINISH test-main") )

(test-main)

当运行功能" test-main"我们有结果:

START test-main

MAIN my-local-var:MY LOCAL VARIABLE VALUE

SUB test-sub-fun-var:my-local-var:MY LOCAL VARIABLE VALUE

FINISH test-main

正如您所看到的,函数" test-sub-fun-var"可以访问变量" my-local-var "在函数" test-main"中声明。但我需要功能" test-sub-fun-var"无法访问变量" my-local-var "。我怎么能这样做?感谢。

1 个答案:

答案 0 :(得分:0)

您没有说明您使用的是什么版本的Emacs。在24.1之前,没有办法做你想做的事,你只需要小心。但是,引用最新版本的信息手册(26.0.50.1):

  

11.9.3词汇绑定

     

词汇绑定作为可选功能引入Emacs中   版本24.1。 [...]   词汇绑定变量具有“词法范围”,意味着任何   对变量的引用必须以文本方式定位在绑定中   构造

您可以使用文件局部变量lexical-binding在每个文件的基础上启用词法绑定。所以,

;; -*- lexical-binding:t -*-

(defun test-sub-fun-var()
  (message "SUB test-sub-fun-var: my-local-var: %s" my-local-var))
(defun test-main()
   (message "\nSTART test-main")
   (let ((my-local-var))
       (setq my-local-var "MY LOCAL VARIABLE VALUE")
       (message "MAIN my-local-var: %s" my-local-var)
       (test-sub-fun-var))
   (message "FINISH test-main"))

(test-main)

现在你的输出是:

START test-main
MAIN my-local-var: MY LOCAL VARIABLE VALUE
test-sub-fun-var: Symbol’s value as variable is void: my-local-var