Clojure常量的惯例,风格和用法?
在风格,惯例,效率等方面定义Clojure常量的最佳实践是什么?
例如,这是正确的吗?
(def *PI* 3.14)
问题:
常量是否应该在Clojure中大写?
在风格上,他们应该有一个或两个星号(*)字符?
任何计算效率的考虑我应该知道的?
从http://dev.clojure.org/display/community/Library+Coding+Standards :
仅将耳罩用于重新绑定的物品。 不要使用常量的特殊符号; 除非另外指定,否则假定所有情况都是恒定
我不认为有任何硬性规定。 我通常不给他们任何特别的待遇。 在一种function语言中,常数与其他任何值之间的区别较小,因为事物往往是纯粹的。
双方的星号在Clojure中被称为“耳罩”。 它们通常用来表示一个“特殊的”var,或者是一个var,它会在稍后使用绑定dynamic地反弹。 类似的东西,其中有时反弹到用户不同的stream,这是例子。
就我个人而言,我只是把它命名为pi
。 我不认为我曾经见过人们在Clojure中给常量特殊的名字。
编辑:卡普先生只是指出,他自己在他的代码大写常量,因为这是一个其他语言的约定。 我想这表明至less有一些人这样做。
我通过编码标准快速浏览了一下,但没有发现任何关于它的信息。 这使我得出这样的结论,不pipe你是否把它们利用起来,都是由你来决定的。 从长远来看,我不认为有人会对你进行抨击。
在计算效率方面,你应该知道在Clojure中不存在全局常量。 你上面的是一个var,每次你引用它,它都会查找。 即使你不戴上耳罩,也总是可以反弹,所以价值总是可以改变的,所以它们总是在桌子上被抬起来。 对于性能严重的循环来说,这是最不切实际的。
有一些select,比如在你的关键循环中放置一个let块,让任何“常量”variables的值,以便它们不被查找。 或者创build一个无参数macros,以便将常量值编译到代码中。 或者你可以创build一个静态成员的Java类。
看到这篇文章,以下关于常量的讨论更多信息:
耳罩是一种表示给定符号在某个点上将具有自己的线程本地绑定的方式。 因此,将耳罩应用于您的Pi常数是没有意义的。
*clojure-version*
是Clojure常量的一个例子,它完全是小写的。
不要使用常量的特殊符号; 除非另外指定,否则假定所有情况都是恒定
见http://dev.clojure.org/display/community/Library+Coding+Standards
Clojure有各种文字,如:
3.14159 :point {:x 0 :y 1} [1 2 3 4] #{:a :b :c}
文字是不变的。 据我所知,没有办法定义新的文字。 如果你想使用一个新的常量,你可以在编译时在代码中有效地生成一个文字:
(defmacro *PI* [] 3.14159265358979323) (prn (*PI*))
在Common Lisp中,有一个用加号( +my-constant+
)命名常量的约定,在Scheme中,用一个美元符号( $my-constant
)作为前缀。 看到这个页面 。 任何这样的约定与官方的Clojure编码标准相冲突,在其他答案中有联系,但也许有必要区分常规variables和:const
属性定义的variables。
我认为给予任何types的非函数variables都有一些优点。 假设除了定义为保存函数的variables之外,通常只使用由函数参数定义的本地名称, let
等。如果仍然偶尔使用def
定义一个非函数variables,那么当它的名字出现在一个函数定义中文件,它看起来像一个局部variables的眼睛。 如果函数复杂,则可能花费几秒钟的时间在函数内查找名称定义。 根据variables的使用,添加一个像耳罩或加号或全部大写的区分特征,这使得显而易见的是variables的定义是在其他地方。
另外,有一些很好的理由让特殊的常量像pi这个特殊的名字,所以没有人会怀疑pi
是指“打印索引”,还是第i个比萨,还是“保存的界面”。 当然, 我认为这些variables应该有更多的信息名称,但是很多人使用的是隐含的,简短的variables名称,我最终读到了他们的代码。 我不应该怀疑pi
是否意味着pi,所以像PI
这样的东西可能是有道理的。 没有人会认为这是Clojure中的工厂variables的运行。
根据“实用Clojure”的书,它应该被命名为*pi*