2012-10-30 11 views
5

Versione FSI: 11.0.50727.1Le indentazioni delle direttive preprocessore sono sensibili in F #?

Quindi stavo lavorando a uno script di shell F # e mi sono imbattuto in qualcosa che mi ha sorpreso.

Quando ho fatto questo:

#if INTERACTIVE 
    #r "System.Data.dll" 
    #r "FSharp.Data.TypeProviders.dll" 
    #r "System.Data.Linq.dll" 
#endif 

open System 

ho ottenuto un errore FS0010 quando ho incollato il blocco nel FSI. Ma se non indentavo le righe #r, nessun errore FS0010. Sono solo un po 'sorpreso che le linee del preprocessore siano sensibili all'indentazione. È un problema del compilatore o c'è qualcos'altro al lavoro qui?

risposta

4

penso che la specifica e la documentazione sono abbastanza chiare su questo argomento, ma la specifica fa una distinzione importante tra direttive del preprocessore lessicali e direttive del compilatore (vedi §12.4):

Compiler le direttive sono dichiarazioni in moduli non nidificati o gruppi di dichiarazione dello spazio dei nomi nel seguente formato:

# id string ... string 

I direttive del preprocessore lessicali#if, #else, #endif e #indent "off" sono simili a compilatore direttive. Per dettagli su #if, #else, #endif, vedere §3.3. La direttiva #indent "off" è descritta in §18.4.

La mia interpretazione è che direttive del preprocessore lessicali sono in realtà hanled da alcuni preprocessore prima di eseguire la compilazione principale e quindi il rientro non importa per questi.

D'altra parte, le direttive come #r, #load, #time ecc vengono elaborati successivamente dal compilatore e quindi hanno bisogno per soddisfare le consuete linee guida # indentazione F.

Come @unwind dice, il documentation Stati "L'indentazione non è significativo per le direttive del preprocessore", ma credo che questo vale solo per le direttive del preprocessore elencati in quella pagina di documentazione (che sono direttive del preprocessore lessicali e non direttive del compilatore).

+0

Grazie Tomas. È stato abbastanza facile aggirare una volta che l'ho capito. Mi chiedevo solo se fosse un vero problema o semplicemente mi fraintendessi qualcosa. –

+0

È un punto interessante :-) Ero piuttosto curioso di sapere se questo è effettivamente descritto da qualche parte - la specifica aiuta un po '. –

2

Secondo the documentation, deve essere qualcos'altro al lavoro:

L'indentazione non è significativo per direttive del preprocessore.

+0

Sai che è divertente rilassarsi. Ho guardato la pagina del documento che hai collegato, ma mi mancava quella parte di indentazione. Questo è ciò che ottengo per i documenti skimming. –

Problemi correlati