2013-08-08 9 views
6

私は、通常のC#プログラマ午前のF#自分自身を教えています。F#コメントエラー

(**)を使用してチャプターを調べていますが、コメント自体からエラーが表示されています。

module Characters 

let vowels = ['a', 'e', 'i', 'o', 'u'] 

printfn "Hex u0061 = '%c'" '\u0061' 

(* <------------Error is here, is 'End of file in string embedded in comment begun at or before here' 
    Character Escape Sequences 

    Character  Meaning 
    ------------------------------- 
    \'    Single Quote 
    \"    Double Quote 
    \\    Backslash 
    \b    Backspace 
    \n    Newline 
    \r    Carriage Return 
    \t    Horisontal Tab 
*) 

私はコメントをエスケープする必要があるという意味の文字列のようなコメントを扱っていますか?

答えて

11

F#のトリビア時間!これは設計によるものです。 Block comments can be nested, and strings within a block comment are tokenized like regular strings。この場合、有効な文字リテラルは "文字列"としてカウントされます。

(* "embedded string, this --> *) doesn't close the comment" *) 
(* (* nested *) comment *) 
(* quote considered to be in char literal '"' is ok *) 

しかし、これらは

(* "this string is not closed *) 
(* " this quote --> \" is escaped inside a string *) 

そして、それが十分でクレイジーではなかったかのように、そこに(*)以来special treatment for operators which begin with *である等が正常になりません。

は、したがって、これらは、有効なブロックコメントですブロックコメントの開始または終了とみなされます。

(* I can talk about the operator (*) without ending my comment *) 

私の知る限り、これらはすべて(ネストされたコメントは、間違いなく、文字列がわからない)MLから継承されます。

だからあなたの目的のために、あなたはこのような何かしたいと思うかもしれません。確かに

(* Character  Meaning 
    ------------------------------- 
    " \' "   Single Quote 
    " \" "   Double Quote 

    or 

    '\''   Single Quote 
    '"'    Double Quote 
*) 
2

「二重引用符」行が問題であることが表示されます。私がその行を削除すると、エラーは消えてしまいます。私は、ブロックコメントをしているのではなく、//で各行の前に付ける場合、問題が発生しないため、これは、パーサのバグのように見えます。これを[email protected]に送信することをお勧めします。もしそれがVisual Studio 2013のためにまだ修正されていないなら、それは遅すぎるかもしれません。

全く無関係:あなたvowelsリストは5部構成のタプルである単一の要素が含まれています。 5つの部分からなるタプルを1つ含むリストの代わりに文字のリストにしたい場合は、コンマの代わりにセミコロンを使用します。

+1

を。 '(*" *) ' – Daniel

+1

。同じエラーが発生する。しかし'(* 『』 *) 'しません。。ブロックコメントの中にバランスの取れた二重引用符をしたいまた、母音のコメントを –

+0

おかげように見えますが、これは単なるです本からの例。ちょうど流れと一緒に行く。 –