我以前学过Clojure,真的很喜欢它。我也喜欢Emacs,并且用Emacs Lisp破解了一些简单的东西。然而,有一件事阻止了我在精神上与Elisp一起做任何更实质性的事情。它是动态作用域的概念。我只是害怕它,因为它对我来说太陌生了,而且闻起来像半全局变量。
所以对于变量声明,我不知道哪些事情是安全的,哪些事情是危险的。据我所知,使用setq设置的变量属于动态作用域(对吗?)那么let变量呢?我在某处读到let允许你做简单的词法作用域,但在其他地方我读到let变量也是动态作用域的。
我想我最担心的是我的代码(使用setq或let)意外地破坏了我调用的平台或第三方代码中的一些变量,或者在这样的调用之后,我的局部变量意外地被搞乱了。我怎样才能避免这种情况?
有没有一些简单的经验法则,我只需遵循,就可以确切地知道作用域发生了什么,而不会被一些奇怪的、难以调试的方式所困扰?
发布于 2013-04-20 04:26:01
正如Peter Ajtai所指出的:
从emacs-24.1开始,可以在每个文件的基础上启用词法作用域,方法是
;; -*- lexical-binding: t -*-
在你的elisp文件的顶部。
发布于 2010-09-25 03:52:20
我完全能感受到你的痛苦。我发现emacs中缺乏词法绑定相当恼人,尤其是不能使用词法闭包,这似乎是我从更现代的语言中想到的一个解决方案。
虽然我没有更多的建议来解决之前答案还没有涵盖的缺乏的功能,但我想指出一个名为‘`lexbind’的emacs分支的存在,它以一种向后兼容的方式实现词法绑定。根据我的经验,词法闭包在某些情况下仍然有一些缺陷,但这个分支似乎是一种很有前途的方法。
发布于 2014-09-04 15:22:42
就是不要。
Emacs-24允许您使用lexical-scope。快跑吧
(setq lexical-binding t)
或添加
;; -*- lexical-binding: t -*-
在您的文件的开头。
https://stackoverflow.com/questions/3786033
复制相似问题