Visual Studio 2012 で F# を使用すると、次のコードがコンパイルされます。
let ``foo.bar`` = 5
ただし、このコードは次のことを行いません。
type ``foo.bar`` = class end
Invalid namespace, module, type or union case name
F# 言語仕様のセクション 3.4 によると、次のようになります。
Any sequence of characters that is enclosed in double-backtick marks (````),
excluding newlines, tabs, and double-backtick pairs themselves, is treated
as an identifier.
token ident =
| ident-text
| `` [^ '\n' '\r' '\t']+ | [^ '\n' '\r' '\t'] ``
セクション 5 では、タイプを次のように定義しています。
type :=
( type )
type -> type -- function type
type * ... * type -- tuple type
typar -- variable type
long-ident -- named type, such as int
long-ident<types> -- named type, such as list<int>
long-ident< > -- named type, such as IEnumerable< >
type long-ident -- named type, such as int list
type[ , ... , ] -- array type
type lazy -- lazy type
type typar-defns -- type with constraints
typar :> type -- variable type with subtype constraint
#type -- anonymous type with subtype constraint
... そして、セクション 4.2 では long-ident を次のように定義しています。
long-ident := ident '.' ... '.' ident
仕様からわかる限り、型は long-idents で命名されており、long-idents は idents にすることができます。ident は二重のバッククォートで引用された句読点をサポートしているため、型もサポートする必要があるようです。
だから私は仕様を誤解していますか?それとも、これはコンパイラのバグですか?