F#标识符,模块,类型和成员名称中允许哪些字符?

时间:2016-12-22 01:49:31

标签: f# clr member naming let-binding

此问题与标识符中的字符有关,而不是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 @>

除了命名测试之外,我没有看到太多用途,但它让我想知道:类型和模块名称支持哪些字符,成员名称和绑定的字符是什么?

一些测试:

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#本身也不会这样做?

1 个答案:

答案 0 :(得分:4)

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

  

请注意,当标识符用于类型名称时,将使用union   键入大小写,模块或命名空间,以下字符不是   即使在双重反击标记内也允许:
  .+$&[]/\\,{{ 1}},*\"

除此列表外,任何名称都允许使用`(at-sign),但会发出警告:

  

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

尽我所能:

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

由于这用于生成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)
  或字符?_$@(重音符号)和`