【问题标题】:What characters are allowed in F# identifiers, module, type and member names?F# 标识符、模块、类型和成员名称中允许使用哪些字符?
【发布时间】:2017-05-07 13:52:13
【问题描述】:

这个问题是关于标识符中的字符,而不是keywords as identifiers

我找到了this question on C# names,但在 F# 上找不到相同的内容。通常这几乎无关紧要,但在我的测试命名中,我经常使用点 . 并且很惊讶它在模块名称中不受支持,但在 let-binding 中受支持:

// fails:
module ``Run Test.Me functions`` = 
    [<Test>]
    let ``X.Add should add``() = test <@ X.Add 2 2 = 4 @>

// Succeeds
module ``Run Test-Me functions`` 
    [<Test>]
    let ``X.Add should add``() = test <@ X.Add 2 2 = 4 @>

在命名测试之外,我看不出它有多大用处,但它让我想知道:类型和模块名称支持哪些字符,成员名称和 let 绑定支持哪些字符?

一些测试:

module ``Weird.name`` = ()  // fails
module ``Weird-name`` = ()  // succeeds
module ``Weird()name`` = () // succeeds (?)
module ``Weird*name`` = ()  // fails
module ``Weird+name`` = ()  // fails
module ``Weird%name`` = ()  // succeeds (?)
module ``Weird/name`` = ()  // fails
module ``Weird\\name`` = () // fails

所有这些名称都在 let-binding 或成员名称中成功,但不是作为类型名称或模块名称。至少这是一致的。但是我在允许和不允许的内容中找不到任何行或逻辑

也许限制是由 CLR/MSIL 而不是 F# 本身施加的?

【问题讨论】:

  • @guy,我碰巧在我的另一个屏幕上打开了语言规范,不知道为什么我没有发现它。你可能想把它变成一个答案,即使有人可以在规范中找到它,也不要认为把它作为问答放在这里应该是不好的(但是,老实说,那东西很难阅读!)

标签: f# clr member naming let-binding


【解决方案1】:

看看F# Language Specification 4.0 - 在3.4 Identifiers and Keywords 部分。

请注意,当标识符用于类型名称时,联合 类型大小写、模块或命名空间,以下字符不是 即使在双反引号内也允许:
.+$&amp;[]/\\、@9876543345@、@9876 , `

除此列表外,@(at-sign)可以使用任何名称,但会引发警告:

警告 FS1104:包含“@”的标识符保留用于 F# 代码生成

尽我所能:

可以在 F# 编译器中找到名称为 IllegalCharactersInTypeAndNamespaceNames 的字符列表。

由于这是用于生成 IL,因此导致 ECMA-335 - Common Language Infrastructure (CLI) Partitions I to VI 内容为:

II.5.3 标识符 - 标识符用于命名实体。简单的 标识符等同于 ID。但是,ILAsm 语法允许 使用可以使用 Unicode 形成的任何标识符 字符集(见分区 I)。为此,标识符应 放在单引号内。

ID 是一个以
开头的连续字符串 字母字符(A–Z、a–z)
_$@`(重音)或?之一,
后跟任意数量的
字母数字字符(A–Z、a–z、0–9)
或字符_$@`(重音)和?

【讨论】:

  • 联合类型案例是有道理的:它在内部编译成一个类型。我的猜测是这个列表是由 IL 限制驱动的。
  • 我冒昧地编辑了您的问题,我刚刚发现@-sign 是允许的,但会发出警告。只是为了完整起见;)。
  • @Abel 随时编辑我的任何问题或答案。都是抄送,一旦我写到这里,我就不再认为它是我的了。
  • IT̶c̶o̶u̶l̶d̶b̶e̶解析问题,̶,否则会产生歧义在创建AST从̶E̶B̶N̶F̶.̶罢工,它不应该的问题,分隔符``是相当明确的。 SPAN >
  • 感谢您的编辑,这意味着 ILASM 施加了限制,而不是要求,后者允许根据您的报价使用任何 unicode 字符。
猜你喜欢
  • 2011-06-15
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
相关资源
最近更新 更多