我正在寻找clojure关键字中允许的字符列表。具体来说,我有兴趣知道是否允许以下任何字符:-
_
/
。
我不是java程序员,所以如果有的话,我不会知道潜在的后果。如果有这样的话,我不知道clojure关键字是否映射到java关键字。
答案 0 :(得分:16)
修改:
当我最初撰写这个答案时,我可能对“你能逃脱什么?”的问题投入太多了。尽管如此,关键字可容许性问题似乎仍未解决。所以:
首先,关于关键词,对于新读者:
:foo
)没有命名空间组件。合格的关键字看起来像:foo/bar
,其中斜杠之前的部分是命名空间,表面上是。关键字不能被引用,并且可以被赋予不存在的命名空间,因此它们的命名空间行为与其他Clojure对象不同。:foo
,也可以通过keyword
函数创建关键字,(keyword name-str)
或(keyword ns name)
。官方允许什么?
根据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
偶尔为我的代码增添趣味(作为同义词的真假)