作为一个非暴力者,我应该如何最好地理解vars命名为*var-name*
的命名约定?
这似乎是一个指示全局变量的lisp约定。但是在clojure中,据我所知,这些变量出现在命名空间中。
我真的很感谢作者在他们的代码中使用这些变量时我应该期待什么,理想情况下是一个例子,说明如何以及为什么在clojure库中使用和更改这样的var。
答案 0 :(得分:19)
这是其他Lisps中使用的惯例,例如Common Lisp,用来区分special variables,区别于词汇变量。 特殊或动态变量将其绑定存储在动态环境中,这意味着它对代码中任何一点可见的当前值取决于它如何绑定到更高的值调用堆栈,而不是仅依赖于最本地的词法绑定表单(例如let
或defn
)。
请注意,在他的书Let Over Lambda中,Doug Hoyte反对用于命名特殊变量的“耳罩”asterix约定。他使用一种不寻常的宏样式来引用自由变量,他更喜欢不承诺或区分这些符号最终会引用词法变量还是动态变量。
虽然专门针对Common Lisp,但您可能会喜欢Ron Garret的文章The Idiot's Guide to Special Variables。其中大部分仍然适用于Clojure。
答案 1 :(得分:16)
功能编程完全是关于安全可预测的功能。事实上,我们中的一些人害怕那种诡异的“远距离行动”的事情。当人们调用一个函数时,他们会得到一个温暖的模糊满足,即如果函数调用函数或再次读取值,函数将始终给出相同的结果。 *un-warm-and-fuzzy*
存在着强烈的事情来警告程序员这个变量比其他一些变量更少可爱。
答案 2 :(得分:7)
我在Clojure新闻组中找到的一些参考文献:
Re:使代码可读 约翰D.休谟 星期二,2008年12月30日08:30:57 -0800
2008年12月29日星期一下午4:10,Chouser写道: 我认为像这样的全球价值观的成语是放置星号 名字周围。
我认为星号约定是针对变量的 动态绑定。我花了一分钟才弄清楚我得到了什么 理念。 “编程Clojure”表明它(没有说完) 第6章第3节。
“用于动态绑定的Vars有时被称为特殊变量 ABLES。为它们命名是一种很好的风格 带有前导和尾随的星号。“
显然这本书正在进行中,但确实如此 合理。值变化的变量的特殊约定(或 我的代码欢迎重新绑定)对我来说似乎比一个更有用 “全局”(虽然我不确定我会考虑网格大小的东西 对于给定的应用程序全局)。基于ants.clj,它显示为Rich 不觉得需要有一个特殊的命名约定 有点值。
和...
我认为像这样的全球价值观的成语是放置星号 围绕这个名字。只有在使用时才应使用下划线(和CamelCase) Java互操作所需:
(def *grid-size* 10)
(def *height* 600)
(def *margin* 50)
(def *x-index* 0)
(def *y-index* 1)