我之前学习过Clojure并且非常喜欢这门语言。我也很喜欢Emacs,并用Emacs Lisp编写了一些简单的东西。然而,有一件事情会让我在使用Elisp时产生心理障碍,那就是动态作用域的概念。它对我来说太陌生了,感觉像是半全局变量。
因此,在变量声明方面,我不知道哪些操作是安全的,哪些是危险的。据我所知,使用setq设置的变量属于动态作用域(是这样吗?)那么let变量呢?我在某个地方读到let允许你使用纯词法作用域,但在其他地方又读到let变量也是动态作用域。
我想我的最大担心是我使用setq或let时,我的代码可能会意外破坏平台或第三方代码中的一些变量,或者在调用后我的本地变量会被意外地破坏。我该如何避免这种情况?
有没有一些简单的经验法则可以遵循,并且不用担心以某种奇怪和难以调试的方式被咬住?