Clojure常量的约定,样式和用法?

Jul*_*ang 40 clojure

在样式,约定,效率等方面,在Clojure中定义常量的最佳实践是什么?

例如,这是对的吗?

(def *PI* 3.14)

问题:

常量应该在Clojure中大写吗?

在风格上,他们是否应该在一侧或两侧都有星号(*)?

我应该注意的任何计算效率考虑因素?

小智 43

来自http://dev.clojure.org/display/community/Library+Coding+Standards:

仅将耳罩用于重新绑定的物品.不要对常量使用特殊符号; 除非另有说明,否则一切都假设为常数.

  • 不言而喻,"不要对常量使用特殊符号"意味着你应该避免大写......但无论如何我都说过了. (5认同)

Ray*_*yne 24

我认为没有任何硬性规定.我通常根本不给他们任何特殊待遇.在函数式语言中,常量和任何其他值之间的区别较小,因为事物通常更纯粹.

两侧的星号在Clojure中被称为"耳罩".它们通常用于表示"特殊"var,或者稍后将使用绑定动态反弹的var.东西一样其中由用户和如实例偶尔反弹到不同的流.

就个人而言,我只想说出来pi.我不认为我曾经见过人们在Clojure中给常量赋予特殊名称.

编辑:卡尔先生刚刚指出,他自己将代码中的常量大写,因为它是其他语言的惯例.我想这表明至少有一些人这样做.

我快速浏览了编码标准,但没有发现任何相关信息.这使我得出结论,无论你是否利用它们,都取决于你.从长远来看,我认为没有人会为你拍打它.


小智 13

在计算效率方面你应该知道在Clojure中没有全局常量这样的东西.你上面的是一个var,每次你引用它时,它都会进行查找.即使你没有把耳罩放在上面,变速器总是可以反弹,所以价值总是会改变,所以它们总是在桌子上查找.对于性能关键循环,这绝对是非最佳的.

有一些选项可以在你的关键循环周围放置一个let块,并让任何"常量"变量值保持不变.或者创建一个无参数宏,以便将常量值编译到代码中.或者您可以使用静态成员创建Java类.

有关详细信息,请参阅此文章以及有关常量的以下讨论:

http://groups.google.com/group/clojure/msg/78abddaee41c1227

  • 如果将^:const添加到Var中,它将内联Var,也就是说,它将在加载名称空间时查找一次值,并且它将使用Var替换所有使用值本身的值。 (2认同)

And*_*ers 8

耳罩是一种表示给定符号在某些点上具有其自己的线程局部绑定的方式.因此,将耳罩应用于Pi常数是没有意义的.

*clojure-version* 是Clojure中常量的一个例子,它完全是小写的.

  • 是的,反弹/线程本地绑定.但是为什么*clojure-version*应该被反弹超出我的范围. (4认同)

esp*_*eed 6

不要对常量使用特殊的表示法;除非另有说明,否则一切都假定为常数。

请参阅http://dev.clojure.org/display/community/Library+Coding+Standards