2016-12-22 45 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,一旦我寫在這裏,我不再認爲它是我的。 –

相關問題