为什么Scala将标识符中的符号和字母分开,我可以更改吗?

为什么Scala将标识符中的符号和字母分开,我可以更改吗?,scala,Scala,我正在考虑将Scala用于音乐创作的内部DSL(即DSL实际上是Scala)。我想使用带有字符的标识符,比如锐符号,♯ (U+266F)。看起来这是不可能的: val c♯0 = 13 不解析。我能得到的最接近的结果是: val c0_♯ = 13 我不喜欢它。强制这样命名标识符的理由是什么?Scala的语法试图满足许多相互冲突的需求。为了在“类运算符”方法名称(如+、/或::)及其两侧的参数之间设置可选的空格,必须有一种方式来表示给定名称包含标点符号和字母数字字符的混合 请记住,内部DSL

我正在考虑将Scala用于音乐创作的内部DSL(即DSL实际上是Scala)。我想使用带有字符的标识符,比如锐符号,♯ (U+266F)。看起来这是不可能的:

val c♯0 = 13
不解析。我能得到的最接近的结果是:

val c0_♯ = 13

我不喜欢它。强制这样命名标识符的理由是什么?

Scala的语法试图满足许多相互冲突的需求。为了在“类运算符”方法名称(如
+
/
::
)及其两侧的参数之间设置可选的空格,必须有一种方式来表示给定名称包含标点符号和字母数字字符的混合

请记住,内部DSL不是新语言!它们充其量只是一种新语言的幻觉。他们仍然是斯卡拉

如果希望完全自由地控制提供给用户的语言,可以编写combinator解析器或使用外部解析器生成器


对于任何在Scala中参与语言处理的人,我强烈建议您在推出自己的狭隘、单一用途的语言处理代码之前先检查一下。Kiama是一颗宝石

请注意,
#
是Scala中保留的几个单字符标点之一。其他包括
{
}
。这有另一面。绝对地,任何符号串都可以作为名称使用,方法是将其括在后面的记号中(这里有点难用…)。FWIW,我想
val`c♯0`=13
仍然可以接受。哦,我知道现在您使用的是Unicode音乐符号,而不是ASCII
#
。考虑将其命名为
?这样你就可以拉皮条了,你的“音符”,它会返回新转换的音符,如
val c_sharp=c。♯。谢谢,但在这种情况下,我真的想使用像C这样的符号♯0,B♭4等。我可能会使用外部DSL。我仍然可以使用Scala编写解释器。