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

时间:2010-10-17 02:31:43

标签: clojure

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

我不是java程序员,所以如果有的话,我不会知道潜在的后果。如果有这样的话,我不知道clojure关键字是否映射到java关键字。

4 个答案:

答案 0 :(得分:16)

修改

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

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

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

官方允许什么?

根据reader documentation,允许使用单个斜杠,名称中没有句点,以及所有与符号相关的规则。

实际允许什么?

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

user> :-_./asdfgse/aser/se
:-_./asdfgse/aser/se

似乎是合法的。上述关键字的命名空间为:

user> (namespace :-_./asdfgse/aser/se)
"-_./asdfgse/aser"

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

keyword功能更加宽容:

user> (keyword "////+" "/////")
:////+//////
user> (namespace (keyword "////+" "/////"))
"////+"

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

未来可能发生的事情:

关于验证关键字的确实存在一些问题。据推测,最长的开放clojure tickets之一涉及关键字的验证。因此,关键字功能可能在将来不再那么宽松,尽管这似乎已经悬而未决。请参阅assembla票证和google group discussion

答案 1 :(得分:6)

“正确”的答案是documented

  

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

编辑:关于关键字:

  

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

答案 2 :(得分:4)

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

就Clojure成语而言, - 是你在符号名称中最好的朋友。它取代了Java中的camel case或Ruby中的下划线。

答案 3 :(得分:4)

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

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