2016-12-22 5 views
3

Этот вопрос касается символов в идентификаторах, а не keywords as identifiers.Какие символы разрешены в идентификаторах F #, имени модуля, типа и имени?

Я нашел this question on C# names, но не смог найти то же самое на F #. Как правило, это вряд ли уместно, но в моих тестах имен я часто использую точку . и был удивлен, что не было поддержано в имени модуля, но поддерживается в LET-связывания:

// 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 открыта на моем другом экране, не знаю почему я этого не заметил. Вы можете захотеть превратить это в ответ, не думайте, что это должно быть плохо, чтобы иметь его здесь как Q & A, даже если кто-нибудь может найти его в спецификации (но, честно говоря, эту вещь трудно читать!) – Abel

ответ

4

Взгляните на F# Language Specification 4.0 - В разделе 3.4 Identifiers and Keywords.

Обратите внимание, что, когда идентификатор используются для названия типов, объединение типа корпуса, модуля или пространства имен, следующие символы не допускаются даже внутри двойной кавычки марок:
., +, $, &, [, ], /, \\, *, \", `

В дополнение к этому списку, то @ (по-знака) допускается в любое имя, но поднимет предупреждение:

предупреждение FS1104: Идентификаторы, содержащий «@», зарезервированы для использования в F поколения # код

Насколько я могу найти:

список персонажей можно найти в F # компилятор с именем IllegalCharactersInTypeAndNamespaceNames.

Как это используется для генерации IL, что приводит к ECMA-335 - Common Language Infrastructure (CLI) Partitions I to VI, который гласит:

II.5.3 Идентификаторы - Идентификаторы используются для именования лиц. Простые идентификаторы эквивалентны идентификатору. Однако синтаксис ILAsm позволяет использовать любой идентификатор, который может быть сформирован с использованием набора символов Unicode (см. Раздел I). Для этого идентификатор должен быть размещен в одинарных кавычках .

ID представляет собой непрерывную последовательность символов, которая начинается с либо
буквенный символ (A-Z, а-г)
или один из _, $, @, ` (апостроф) или ?,
и сопровождается любым количеством
буквенно-цифровых символов (A-Z, A-Z, 0-9)
или символы _, $, @, ` (апостроф) и ?

+0

Тип соединения случай имеет смысл: он скомпилирован в тип внутри. Я предполагаю, что этот список управляется ограничениями IL. – Abel

+0

Я взял на себя смелость, чтобы отредактировать ваш вопрос, я просто обнаружил, что '@' -sign разрешен, но выдает предупреждение. Просто ради полноты;). – Abel

+1

@Abel Не стесняйтесь редактировать любые мои вопросы или ответы. Это все СС, и как только я напишу его здесь, я больше не считаю его моим. –

 Смежные вопросы

  • Нет связанных вопросов^_^