2016-12-22 21 views
3

这个问题是关于标识符中的字符,而不是keywords as identifiers。我发现this question on C# names,但在F#上找不到相同的东西。通常,这是没有什么关系的,但是在我的测试命名我经常使用的点.,惊讶它不是在一个模块名称支持,但在let结合支持:命名测试F#标识符,模块,类型和成员名称中允许使用哪些字符?

// 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 

所有这些名字在让结合或成员名成功,但不是一个类型名称或模块名称。至少这是一致的。但是我找不到任何行或逻辑,什么是允许的,什么不是。

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

+0

@guy,我碰巧在另一个屏幕上打开了lang spec,不知道为什么我没有发现它。你可能想把它变成一个答案,即使有人可以在规范中找到答案,也不要认为它应该在这里作为问答(尽管如此,这件事很难阅读!) – Abel

回答

4

看看F# Language Specification 4.0 - 在栏目3.4 Identifiers and Keywords

注意的是,当标识用于一个类型,联合 型的情况下,模块,或命名空间的名称,下面的字符不 甚至内部双反引号标记允许:
.+$&[]/\\*\"`

除了此列表中,@(at符号)被允许以任何名义,但会提出一个警告:

警告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)
或字符_$@`(重音符),和?

+0

联盟类型大小写有意义:它在内部被编译成一个类型。我的猜测是这个列表是由IL限制驱动的。 – Abel

+0

我冒昧地编辑你的问题,我刚刚发现'@' -sign是允许的,但会发出警告。为了完整起见;)。 – Abel

+1

@Abel随时编辑我的任何问题或答案。这是所有的CC,一旦我写在这里,我不再认为它是我的。 –

相关问题