斯卡拉:如何逃避字面翻的反复?

问题描述 投票:6回答:1

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 literals
1个回答
7
投票

它不能用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"
                      ^
© www.soinside.com 2019 - 2024. All rights reserved.