Clojure关键字中允许的字符是什么?

San*_*osh 14 clojure

我正在寻找clojure关键字中允许的字符列表.具体来说,我有兴趣知道是否允许以下​​任何字符:- _ /.

我不是一个java程序员,所以我不知道其中的潜在影响.如果有这样的事情,我不知道clojure关键字是否映射到java关键字.

Rob*_*lan 16

编辑:

当我最初撰写这个答案时,我可能对"你能逃脱什么?"的问题投入太多了.尽管如此,关键字可容许性问题似乎仍未解决.所以:

首先,关于关键词,对于新读者:

  • 关键词有两种口味,合格和不合格.不合格的关键字:foo没有名称空间组件.表面上,限定关键字看起来像:foo/bar斜杠之前的部分是命名空间.关键字不能被引用,并且可以被赋予不存在的命名空间,因此它们的命名空间行为与其他Clojure对象不同.
  • 关键字既可以通过文字创建给读者,也:foo可以通过keyword函数创建,也就是或.(keyword name-str)(keyword ns name)
  • 关键词只评估自己,不同于指向vars的符号.请注意,关键字不是符号.

官方允许什么?

根据读者文档,允许使用单个斜杠,名称中没有句点,以及所有符号规则.

实际允许什么?

读者可能会或多或少地使用任何空格.例如,

user> :-_./asdfgse/aser/se
:-_./asdfgse/aser/se
Run Code Online (Sandbox Code Playgroud)

看似合法.上述关键字的命名空间是:

user> (namespace :-_./asdfgse/aser/se)
"-_./asdfgse/aser"
Run Code Online (Sandbox Code Playgroud)

因此,命名空间似乎包含上一个正斜杠之前的所有内容.

keyword功能更加宽松:

user> (keyword "////+" "/////")
:////+//////
user> (namespace (keyword "////+" "/////"))
"////+"
Run Code Online (Sandbox Code Playgroud)

同样,如果你使用这个keyword功能,空格也很好.我不确定对Unicode字符有什么限制,但是当我输入任意字符时,REPL似乎没有抱怨.

未来可能会发生什么:

关于验证关键字的确实存在一些问题.据推测,最长的开放式clojure门票之一涉及关键字的验证.因此,关键字功能在将来可能会停止如此宽松,尽管这似乎在空中.查看assembla票证和谷歌小组讨论.


小智 6

从该列表中,读者当然允许 - 和 _,但 / 作为命名空间和符号名称之间的分隔符具有特殊含义。句号(您没有询问过)在符号名称中也是有问题的,因为它用在完全限定的 Java 类名称中。

就 Clojure 惯用语而言, - 是符号名称中最好的朋友。它取代了 Java 中的驼峰式大小写或 Ruby 中的下划线。


Ale*_*art 6

"正确"的答案是记载:

符号以非数字字符开头,可以包含字母数字字符和*,+,!, - ,_和?(最终将允许其他字符,但并非所有宏字符都已确定).'/'具有特殊含义,它可以在符号中间使用一次,以将命名空间与名称分开,例如my-namespace/foo.'/'本身命名除法函数.'' 具有特殊含义 - 它可以在符号中间使用一次或多次来指定完全限定的类名,例如java.util.BitSet,或命名空间名称.以'.'开头或结尾的符号 由Clojure保留.包含/或的符号.据说是"合格的".以':'开头或结尾的符号由Clojure保留.符号可以包含一个或多个非重复的':'.

编辑:进一步关于关键字:

关键字就像符号一样,除了:
*它们可以而且必须以冒号开头,例如:fred.
*他们不能包含'.' 或命名类.
*在当前命名空间中解析以两个冒号开头的关键字


Art*_*ldt 5

从 1.3 开始,您可以'在任何不以关键字开头的地方使用。所以:arthur's-keyword现在是允许的:)

我偶尔使用关键字:-P:-D为我的代码增添趣味(作为 true 和 false 的同义词)

  • 你的同义词是永恒的! (3认同)