Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Membre expérimenté
    Inscrit en
    décembre 2004
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : décembre 2004
    Messages : 430
    Points : 539
    Points
    539

    Par défaut Découverte et affaire de modules

    Bonjour à tous.
    N'ayant jamais pratiqué le moindre langage fonctionnel qui soit et y voyant en général le Mal, j'ai tenté quand même le pas avec F#, ce qui me permettait de rester dans un environnement connu. Hé bien je dois dire que je tiens encore après plus d'une semaine d'immersion complète !
    J'y vois deux raisons : tout d'abord c'est nouveau, complètement nouveau pour moi, une bonne raison de m'y plonger avec intérêt; et ensuite les défis à relever sont intéressants (c'est totalement incompréhensible... ), donc j'y reste, question de fierté personnelle ! Nan mé...

    Reste que les modules me jouent des tours et que j'aurais besoin des lumières d'un savant!
    Je suis en Windows XP SP3 avec Visual Studio 2010 Shell, F# 2.0.0.0 et Dotnet 4.0.30319, ce qui semble assez moderne.

    Problème 1:
    Citation Envoyé par LLB Voir le message
    Chaque fichier (sauf le main) doit indiquer son nom de module ou namespace (au lieu de prendre le nom du fichier).
    (Extrait d'un message pour la dernière livraison en 1.9.quelque-chose)
    D'après mes essais (dans la configuration citée ci-dessus), il faut aussi le module dans le main, faute de quoi on a:
    Erreur 1 Files in libraries or multiple-file applications must begin with a namespace or module declaration, e.g. 'namespace SomeNamespace.SubNamespace' or 'module SomeNamespace.SomeModule'
    Problème 2:
    Voici mes 2 fichiers, Program.fs et Truc.fs
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    module Program
    open System
    open Truc
    let a = Truc.N  //Test avec le préfixe Truc
    let b = F 100   //Test sans le préfixe Truc
    let c = Truc.Chouette.A //Test avec
    let d = Chouette.A      //Test sans
    printfn "a = %d, b = %d" a b
    Console.ReadLine() |> ignore
    Code :
    1
    2
    3
    4
    5
    6
    module Truc
    let N = 1234
    let F x = x + 1
    
    module Chouette =
      let A = 123
    Tout ce que j'affiche en rouge est rejeté par Visual Studio avec le message "Erreur 1 The namespace or module 'Truc' is not defined" ou identique. A noter qu'il trouve bien System...
    Donc, je résume: dès que je veux utiliser plus d'un fichier.fs, il faut mettre des modules, et pourtant il ne les voit pas. Kessifokejfai ?
    Merci

  2. #2
    Max.Adorable
    Invité(e)

    Par défaut

    Salut Thorna,

    En ce qui concerne le fichier main, je pense que LLB parlait du fichier qui contient le point d'entrée du programme. L'équivalent du Main en C#.
    Plus d'info ici, http://research.microsoft.com/en-us/...#_Toc270597618.

    Pour ton problème de module, essaye de cette manière:

    fichier2 (Truc.fs -> le nom du fichier est en général le nom du namespace/module défini dans ce dernier.):
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    namespace Truc
    
    let N = 1234
    let F x = x + 1
    
    module Chouette =
      let A = 123
    fichier1:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    open System
    open Truc
    
    [<EntryPoint>]
    let main args = 
      let a = Truc.N  //Test avec le préfixe Truc
      let b = F 100   //Test sans le préfixe Truc
      let c = Truc.Chouette.A //Test avec
      let d = Chouette.A      //Test sans
      printfn "a = %d, b = %d" a b
      Console.ReadLine() |> ignore
    Note bien que dans ta solution VS2010 le fichier2 doit être avant le fichier1.

    Pour utiliser ce code dans la console interactive, généralement via le fichier script.fsx, tu dois charger le fichier du module/namespace désiré.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #load "Truc.fs"
    
    open System
    open Truc
    
    let a = Truc.N  //Test avec le préfixe Truc
    let b = F 100   //Test sans le préfixe Truc
    let c = Truc.Chouette.A //Test avec
    let d = Chouette.A      //Test sans
    printfn "a = %d, b = %d" a b
    Console.ReadLine() |> ignore
    Voilà quelques pistes qui j'espère résoudront ton problème. Si ce n'est pas le cas on t'aidera avec plaisir.

    Max.

  3. #3
    Membre expérimenté
    Inscrit en
    décembre 2004
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : décembre 2004
    Messages : 430
    Points : 539
    Points
    539

    Par défaut

    Nom de Zeus (de nom de Zeus), comme disait un parent éloigné...
    Citation Envoyé par Max.Adorable Voir le message
    Note bien que dans ta solution VS2010 le fichier2 doit être avant le fichier1.
    Et en plus, j'ai lu ça quelque part... Mais ça ne m'avait pas paru si clair que ça, d'autant que je n'ai pas l'habitude que l'ordre importe et que je ne voyais vraiment pas comment forcer un ordre quelconque dans Visual Studio... Tout simplement parce que dans ma version habituelle de VS C# 2010 Express, non seulement l'ordre n'importe pas mais en plus on ne peut pas le changer ! Et voilà qu'en cliquant-droit sur program.fs, je vois Move Up et Move Down, et même mieux : Add Above, Add Below, options qu'on ne voit pas en cliquant-droit sur le nom de la solution...
    Alors après ça, tout rentre dans l'ordre tout seul : pas besoin de [<EntryPoint>] ni de let main args =, tout fonctionne du premier coup :
    Code :
    1
    2
    3
    4
    5
    module Truc //Obligatoire
    let N = 1234
    let F x = x + 1
    module Chouette =
      let A = 123
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    open Truc
    open System
    
    let a = Truc.N  //Test avec le préfixe Truc
    let b = F 100   //Test sans le préfixe Truc
    let c = Truc.Chouette.A //Test avec
    let d = Chouette.A      //Test sans
    printfn "a = %d, b = %d" a b
    printfn "c = %d, d = %d" c d
    Console.ReadLine() |> ignore
    Citation Envoyé par Max.Adorable Voir le message
    En ce qui concerne le fichier main, je pense que LLB parlait du fichier qui contient le point d'entrée du programme. L'équivalent du Main en C#.
    Oui, j'avais bien compris ça comme ça, mais là encore, plus besoin du nom de module comme je l'avais cru.
    Un grand merci, ça m'apprendra à lire les lignes en petits caractères en bas des pages...

  4. #4
    Max.Adorable
    Invité(e)

    Par défaut

    Salut,

    En effet il faut connaitre le move up/move down, maintenant tu ne l'oubliera plus jamais je pense ^^.

    Max.

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •