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

Conventions, Style, and Usage for Clojure Constants?

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

例如,对吗?

(def *PI* 3.14)

问题:

常量应该在Clojure中大写吗?

从风格上讲,它们的一面或两面都应带有星号(*)?

我应该注意的任何计算效率方面的考虑?


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

Use earmuffs only for things intended for rebinding. Don't use a special notation for constants; everything is assumed a constant unless specified otherwise.


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

两侧的星号在Clojure中称为"耳罩"。它们通常用于指示"特殊"变量,或以后将通过绑定动态反弹的变量。诸如此类的东西,偶尔会被用户反弹到不同的流,这就是示例。

就个人而言,我将其命名为pi。我认为我从未见过有人在Clojure中给常数指定特殊名称。

编辑:卡珀先生刚刚指出,他本人在代码中大写了常量,因为这是其他语言的约定。我想这表明至少有一些人这样做。

我快速浏览了编码标准,但没有找到任何相关信息。这使我得出结论,是否将它们资本化完全取决于您。从长远来看,我认为没有人会为你打耳光。


在计算效率方面,您应该知道Clojure中没有全局常量之类的东西。上面的内容是一个var,每次引用它时,它都会进行查找。即使您没有戴上耳罩,var也会始终反弹,因此值始终会变化,因此总是在表中查找它们。对于性能至关重要的循环,这绝对是非最佳的。

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

有关更多信息,请参见本文和以下有关常量的讨论:

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


耳罩是一种表示给定符号在某个时候将具有其自己的线程局部绑定的方法。因此,将耳罩应用于Pi常量没有任何意义。

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


不要对常量使用特殊的符号;除非另有说明,否则所有内容均假定为常量。

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


在Common Lisp中,有一个用加号(+my-constant+)命名常量的约定,在Scheme中,有一个美元符号($my-constant)前缀。看到这个页面。任何此类约定都与在其他答案中链接的官方Clojure编码标准相冲突,但是将常规var与通过:const属性定义的常规var进行区分也许是合理的。

我认为为任何类型的非函数变量提供某种区别功能是有好处的。假设除了定义为保留函数的变量外,通常仅使用由函数参数,let等定义的局部名称。但是,如果偶尔使用def定义非函数变量,则当其名称出现在函数中时在同一文件中定义,它看起来像局部变量。如果函数很复杂,则可能需要花费几秒钟的时间在函数中查找名称定义。添加适合于变量使用的区别特征,例如耳罩或加号或所有大写字母,可以很明显地看出变量的定义在其他地方。

另外,给pi等特殊常量一个特殊的名称是有充分的理由的,因此没有人会怀疑pi是指" print-index",第i个披萨还是"保留的接口"。当然,我认为这些变量应具有更多信息性的名称,但是许多人使用隐秘的简短变量名,而我最终阅读了他们的代码。我不必怀疑pi是否表示pi,因此pi之类的东西可能有意义。没有人会认为这是Clojure中的mill变量的运行。


Clojure具有多种文字,例如:

1
2
3
4
5
6
3.14159
:point
{:x 0
 :y 1}
[1 2 3 4]
#{:a :b :c}

文字是常量。据我所知,没有办法定义新的文字。如果要使用新的常量,则可以在编译时在代码中有效地生成文字:

1
2
(defmacro *PI* [] 3.14159265358979323)
(prn (*PI*))

根据" Practical Clojure"一书,应将其命名为*pi*