2010-03-08 2 views
5

Lorsque j'ai essayé la programmation de la console, j'ai reçu un résultat inattendu.Est-ce le bug F # Builder ou mon malentendu?

open System 

let printSomeMessage =   
    printfn "Is this the F# BUG?"  

[<EntryPoint>] 
let main args =  
    if args.Length = 2 then 
     printSomeMessage 
    else   
     printfn "Args.Length is not two." 
    0 

La fonction printSomeMessage était incluse dans la fonction .cctor(). Voici le résultat de IL DASM.

.method private specialname rtspecialname static 
     void .cctor() cil managed 
{ 
    // Code size  24 (0x18) 
    .maxstack 4 
    IL_0000: nop 
    IL_0001: ldstr  "Is this the F# BUG\?" 
    IL_0006: newobj  instance void class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`5<class [FSharp.Core]Microsoft.FSharp.Core.Unit,class [mscorlib]System.IO.TextWriter,class [FSharp.Core]Microsoft.FSharp.Core.Unit,class [FSharp.Core]Microsoft.FSharp.Core.Unit,class [FSharp.Core]Microsoft.FSharp.Core.Unit>::.ctor(string) 
    IL_000b: call  !!0 [FSharp.Core]Microsoft.FSharp.Core.ExtraTopLevelOperators::PrintFormatLine<class [FSharp.Core]Microsoft.FSharp.Core.Unit>(class [FSharp.Core]Microsoft.FSharp.Core.PrintfFormat`4<!!0,class [mscorlib]System.IO.TextWriter,class [FSharp.Core]Microsoft.FSharp.Core.Unit,class [FSharp.Core]Microsoft.FSharp.Core.Unit>) 
    IL_0010: dup 
    IL_0011: stsfld  class [FSharp.Core]Microsoft.FSharp.Core.Unit '<StartupCode$FSharpBugTest>'.$Program::[email protected] 
    IL_0016: pop 
    IL_0017: ret 
} // end of method $Program::.cctor 

Ainsi, son résultat d'exécution est comme ceci.

Ai-je manqué une certaine grammaire ou caractéristique F #? Ou BUG F # builder?

Répondre

10

Non, c'est un bug dans votre code. Vous devez ajouter des parenthèses après "printSomeMessage", sinon printSomeMessage est une valeur simple plutôt qu'une fonction.

open System 

let printSomeMessage() =   
    printfn "Is this the F# BUG?"  

[<EntryPoint>] 
let main args =  
    if args.Length = 2 then 
     printSomeMessage() 
    else   
     printfn "Args.Length is not two." 
    0 

valeurs simples sont initialisés dans le constructeur d'un module, de sorte que vous voyez votre code appelé lorsque le module est initialisé. C'est logique quand on y pense, le cas normal des valeurs simples serait de lier une chaîne, un entier, ou une autre valeur littérale à un identifiant. Vous voudriez que cela ne se produise pas. c'est-à-dire que ce qui suit sera lié au démarrage du module:

let x = 1 
let y = "my string" 
+0

Clairement, je pourrais comprendre! Merci! –

+0

Pas de problème, content de ma réponse m'a aidé. – Robert

+0

Clair comme le jour, bonne réponse! –

Questions connexes