8

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 は二重のバッククォートで引用された句読点をサポートしているため、型もサポートする必要があるようです。

だから私は仕様を誤解していますか?それとも、これはコンパイラのバグですか?

4

1 に答える 1

13

仕様が実際の実装と同期していないように見えるので、どちらか一方にバグがあります。

二重のバッククォートで識別子を使用すると、コンパイラはそれを名前として扱い、バッククォートで指定した名前で型 (またはメンバー) を生成します。識別子が有効な型/メンバー名であることを確認するために、名前マングリングは行いません。

これは、コンパイルされたコードで標準的な意味と衝突する識別子を使用できないことは、それほど驚くべきことではないことを意味します。あなたの例ではドットですが、他の例をいくつか示します。

type ``Foo.Bar``() =  // Dot is not allowed because it represents namespace
    member x.Bar = 0

type ``Foo`1``() =    // Single backtick is used to compile generic types
    member x.Bar = 0

type ``Foo+Bar``() =  // + is used in the name of a nested type
    member x.Bar = 0

上記の例は、型名としては許可されていませんが (標準的な意味と衝突するため)、変数名にそのような制限がないため、let バインディングで使用できます。

let ``foo`1`` = 0
let ``foo.bar`` = 2
let ``foo+bar`` = 1

これは間違いなくドキュメントと仕様で説明されるべきものですが、これが何が起こっているのかを明確にするのに役立つことを願っています.

于 2012-10-20T14:23:58.757 に答える