2013-08-08 16 views
6

Mi sto insegnando F # Normalmente sono un programmatore C#.F # Commento errore

Sto tentando di utilizzare lo (**) per prendere appunti per conto mio mentre passo attraverso i capitoli ma ricevo un errore dal commento stesso.

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 
*) 

È questo trattamento il commento come un filo che significa che devo scappare il mio commento?

risposta

11

F # trivia time! Questo è di design. Block comments can be nested, and strings within a block comment are tokenized like regular strings. Valori di char validi contano come "stringhe" in questo caso.

Quindi questi sono i commenti blocco valido:

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

ma questi non sono

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

E come se non bastasse pazzo, c'è special treatment for operators which begin with * dal (*) e simili sarebbe normalmente considerato l'inizio o la fine di un commento di blocco.

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

per quanto ne so, questi sono tutti ereditati da ML (commenti nidificati sono sicuramente, non è sicuro su stringhe).

Così per i vostri scopi, si potrebbe desiderare di fare qualcosa di simile:

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

    or 

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

Sembra che la linea "Doppio preventivo" sia il problema. Se rimuovo quella linea, l'errore scompare. Questo sembra un bug nel parser, poiché il problema non si verifica se prefisso ogni riga con // invece di fare un commento di blocco. Suggerirei di inviarlo a [email protected] - se non è già stato risolto per Visual Studio 2013, forse non è troppo tardi.

Completamente non correlato: l'elenco vowels contiene un singolo elemento costituito da una tupla di 5 parti. Se si desidera che sia un elenco di caratteri anziché un elenco contenente una tupla di 5 parti, utilizzare il punto e virgola anziché le virgole.

+1

Infatti. '(*" *) 'causa lo stesso errore – Daniel

+1

Ma' (* "" *) 'non lo fa Sembra che vogliano virgolette doppie tra virgolette commenti –

+0

Grazie per il commento anche sulle vocali ma questo è solo un esempio tratto da un libro. Sto solo seguendo il flusso in questo momento. –