首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用Emacs Lisp动态作用域?

如何使用Emacs Lisp动态作用域?
EN

Stack Overflow用户
提问于 2010-09-24 18:10:12
回答 3查看 6.8K关注 0票数 58

我以前学过Clojure,真的很喜欢它。我也喜欢Emacs,并且用Emacs Lisp破解了一些简单的东西。然而,有一件事阻止了我在精神上与Elisp一起做任何更实质性的事情。它是动态作用域的概念。我只是害怕它,因为它对我来说太陌生了,而且闻起来像半全局变量。

所以对于变量声明,我不知道哪些事情是安全的,哪些事情是危险的。据我所知,使用setq设置的变量属于动态作用域(对吗?)那么let变量呢?我在某处读到let允许你做简单的词法作用域,但在其他地方我读到let变量也是动态作用域的。

我想我最担心的是我的代码(使用setq或let)意外地破坏了我调用的平台或第三方代码中的一些变量,或者在这样的调用之后,我的局部变量意外地被搞乱了。我怎样才能避免这种情况?

有没有一些简单的经验法则,我只需遵循,就可以确切地知道作用域发生了什么,而不会被一些奇怪的、难以调试的方式所困扰?

EN

回答 3

Stack Overflow用户

发布于 2013-04-20 04:26:01

正如Peter Ajtai所指出的:

从emacs-24.1开始,可以在每个文件的基础上启用词法作用域,方法是

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

在你的elisp文件的顶部。

票数 12
EN

Stack Overflow用户

发布于 2010-09-25 03:52:20

我完全能感受到你的痛苦。我发现emacs中缺乏词法绑定相当恼人,尤其是不能使用词法闭包,这似乎是我从更现代的语言中想到的一个解决方案。

虽然我没有更多的建议来解决之前答案还没有涵盖的缺乏的功能,但我想指出一个名为‘`lexbind’的emacs分支的存在,它以一种向后兼容的方式实现词法绑定。根据我的经验,词法闭包在某些情况下仍然有一些缺陷,但这个分支似乎是一种很有前途的方法。

票数 2
EN

Stack Overflow用户

发布于 2014-09-04 15:22:42

就是不要。

Emacs-24允许您使用lexical-scope。快跑吧

(setq lexical-binding t)

或添加

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

在您的文件的开头。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3786033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档