Scala中的文字允许定义标识符,如answer所述。有没有办法在文字中逃避反击?做类似的事情:
val `hello `world` = "hello world"
更新: 其中一个用例是将refined库用于一些与包含反引号的正则表达式匹配的精炼类型,例如:
import eu.timepit.refined._
import eu.timepit.refined.api.Refined
type MatchesRegexWithBacktick = String Refined MatchesRegex[W.`(a|`)`.T]
它不能用Scala编译器原样完成,但也许用编译器插件可以改变标识符的解析方式(也许如果反向标记的函数以某种方式被一些模糊的unicode字符替换)。
在Scala SLS 1.1中,有标识符的词法语法:
op ::= opchar {opchar}
varid ::= lower idrest
boundvarid ::= varid
| ‘`’ varid ‘`’
plainid ::= upper idrest
| varid
| op
id ::= plainid
| ‘`’ { charNoBackQuoteOrNewline | UnicodeEscape | charEscapeSeq } ‘`’
idrest ::= {letter | digit} [‘_’ op]
问题是,允许除字母,数字或_
之外的任何字符的唯一规则是要求标识符以反向标记引用的规则:
‘`’ { charNoBackQuoteOrNewline | UnicodeEscape | charEscapeSeq } ‘`’
但是,它明确地不允许使用charNoBackQuoteOrNewline
进行反向标记,并且如果您认为可以使用UnicodeEscape
解决它,那么它也不起作用:
scala> val `hello \u0060world` = "hello world"
<console>:1: error: unclosed quoted identifier
val `hello \u0060world` = "hello world"
^