Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Caml]Incrementation

    20 mars 2006 à 19:42:20

    Salut !
    je fait un peut de Caml , je voudrais savoir comment incrementer une variable ?
    j'ai fait comme ca a la barbar, mais ca ne marche pas :
    let i = 1;;
    while i<100 do
        print_int i;
        print_newline();
        let i = i+1;;
    done;
    print_newline();


    si non pour le in dans let , ca agie jusqua quelle porté ? (juste la ligne suivante ?)
    merci
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      20 mars 2006 à 19:47:01

      Tiens, jvais rire : :D

      Plus sérieusement, ça ne "fonctionne pas comme ça". Je te conseille de revoir ton cours et d'oublier ce que tu connais de certains langages primitifs comme le C, le Java ou le Python.
      • Partager sur Facebook
      • Partager sur Twitter
        20 mars 2006 à 19:51:17

        Citation : Bigloo

        Tiens, jvais rire : :D

        Plus sérieusement, ça ne "fonctionne pas comme ça". Je te conseille de revoir ton cours et d'oublier ce que tu connais de certains langages primitifs comme le C, le Java ou le Python.


        ca fonctionne comment alors ? :p
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          20 mars 2006 à 19:56:16

          # let i = 4;;
          val i : int = 4
          # let i = i + 1;;
          val i : int = 5


          (Ici Ocaml)

          S'tu veux, ça fonctionne. Mais c'est pas le principe d'utilisation. Il me semble qu'en débutant en Caml on devrait voir autre chose que les boucles directement.

          Edit : je précise quand même que je me la joue sans pouvoir normalement me le permettre. Je n'ai pas de connaissances précises du Caml ou dérivés :)

          Mais assez pour savoir que cette écriture est tirée d'un réflexe d'un langage impératif standard et que quitte à écrire ça comme ça, autant faire du C.
          • Partager sur Facebook
          • Partager sur Twitter
            20 mars 2006 à 20:15:08

            incr i;
            ça marche ça, non ?
            De toutes façons, sinon après déclaration ça serait plutôt :
            i := i + 1;
            non ?
            (je connais très mal le caml)
            • Partager sur Facebook
            • Partager sur Twitter
              20 mars 2006 à 20:20:17

              avec incr il me met :
              File "1.ml", line 5, characters 9-10:
              This expression has type int but is here used with type int ref
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                20 mars 2006 à 20:46:44

                # incr;;
                - : int ref -> unit = <fun>

                Ici on voit bien que l'argument n'est pas de type int mais int ref : c'est une référence vers un entier (une sorte de pointeur ?)

                Même chose pour := qui est le véritable opérateur d'affectation (si j'ai bien tout compris) en Caml.


                Mais à la réflexion je me demande si let peut être utilisé dans ce contexte en effet. Voir les affectations.

                Attendons Bluestorm.
                • Partager sur Facebook
                • Partager sur Twitter
                  20 mars 2006 à 21:10:22

                  let i = ref 0 in
                  incr i; (* ou i := !i + 1; *)
                  print_int !i;;

                  Voilà voilà, quelque chose de plus logique que ma réponse précédente :p
                  • Partager sur Facebook
                  • Partager sur Twitter
                    20 mars 2006 à 21:21:42

                    Pour changer la valeur d'une variable en cours d'execution en caml, il faut impérativement que ce soit une référence, donc qu'elle soit déclarée comme tel dès le début, avec le mot clé 'ref'.

                    let i = ref 1 in
                    while i<100 do
                        print_int i;
                        print_newline();
                        incr i;
                    done;
                    print_newline();


                    Par ailleurs, je ne sais pas quels cours tu lis, mais tu devrais perdre l'habitude des ;; en fin de variable, et éviter d'utiliser des ref : pour ton code, un for faisait très bien l'affaire :
                    for i = 1 to 100 do
                        print_int i;
                        print_newline();
                    done;
                    print_newline();


                    La portée du in va jusqu'à la fin du bloc : si c'est dans un bloc (if ..then...else, while, for, let .. = ... in ...) c'est jusqu'à la fin du bloc, et si c'est "dans le vide", en dehors de tout bloc, ça va jusqu'au ';;' suivant :
                    va marcher.
                    ne va pas marcher.

                    De manière générale, on évite au maximum les ;; dans un code court. N'utilise que 'in' et ton programme ne s'en portera que mieux. (en plus, il suffira de mettre "let montruc() =" au début et "in" à la fin pour en faire une fonction, alors qu'avec des ;; au milieu ça ne marche pas (on ne peut pas en mettre au milieu d'un bloc, puisque ca termine tous les blocs)).
                    • Partager sur Facebook
                    • Partager sur Twitter
                      20 mars 2006 à 23:46:37

                      Oki Merci je vais essayer ca :)

                      autre probleme qui n'a rien a voir ,impossible de compiler en natif , j'ai toujour ce message :
                      (j'utilise Crimson Editor):

                      Citation : Pas de titre

                      ---------- Capture Output ----------
                      > "C:\Program Files\Objective Caml\bin\ocamlopt.exe" 1.ml
                      'as' n'est pas reconnu en tant que commande interne
                      ou externe, un programme ex‚cutable ou un fichier de commandes.
                      Assembler error, input left in file C:\DOCUME~1\kedare\LOCALS~1\Temp\camlasmfb430c.s

                      > Terminated with exit code 2.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        21 mars 2006 à 21:15:27

                        Hum : tu utilises le compilateur natif (ocamlopt), et ça windows il aime pas. Utilise le compilateur bytecode (ocamlc). (on peut très bien utiliser le natif, mais sous windows c'est un chouilla plus compliqué, je sais pas quoi MinGW blabla linkage pouet pouet...)

                        C'est bizarre qu'il mette ocamlopt. T'as trifouillé les options de crimson par défaut ?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          21 mars 2006 à 22:20:21

                          non non c'est volontaire je veut bien compiler en natif , car le poste client n'a pas forcement Ocaml
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Anonyme
                            21 mars 2006 à 22:21:11

                            Bah c'est "un chouilla plus compliqué"

                            Pourquoi mettre la charrue avant les boeufs : tu sais même pas encore programmer en Caml.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              21 mars 2006 à 23:57:56

                              parceque je veut voir les performances en compilé natif , ou si vous connaissez des programmes Powered by Ocaml ? :p
                              • Partager sur Facebook
                              • Partager sur Twitter
                                22 mars 2006 à 11:06:46

                                Oui, plein : http://caml.inria.fr/cgi-bin/hump.en.cgi?sort=0
                                Ça passe du coq à l'âne, et tu as vraiment de tout.

                                Par ailleurs, c'est pas une surprise, mais on a fait un Benchmark avec NaPs, et ocaml ça poune le python, même avec psyco.

                                Le code de test était un crible d'eratosthène, donc pas d'objet et pas de fonctions (ni ocaml ni python n'étaient sur leur terrain de predilection).
                                Sur ma machine :
                                N 1 000 000
                                Ocaml natif 0.65 s
                                Ocaml bytecode 0.98 s
                                Python 2.52 s
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Anonyme
                                  22 mars 2006 à 11:31:08

                                  Bah on saît très bien que ça bat le python mais c'est pas une référence..
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    22 mars 2006 à 11:54:41

                                    Je sais, je sais, mais le pythonneux avait insisté, donc bah je l'ai fait.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Anonyme
                                      22 mars 2006 à 12:05:11

                                      Bah c'est très humiliant.

                                      Et par rapport au C ?
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        22 mars 2006 à 13:56:19

                                        Le C est à 0.2 s, ce qui fait deux fois plus rapide que la version caml (qui, en fait, j'ai mis un printf pour la sortie, est passée de 0.65 à 0.4s)
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Anonyme
                                          22 mars 2006 à 15:07:50

                                          C'est un score quasi-honorable.
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            22 mars 2006 à 15:18:55

                                            Moui. En même temps ça se veut pas un bench des différents langages : le but de python c'est pas de faire de l'algo, le but du caml c'est pas de faire de l'impératif, et le C n'a pas de but donc forcément il n'a pas de problèmes.
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              27 mars 2006 à 21:38:00

                                              Et l'assembleur, t'as testé ? :p
                                              Je suis curieux de savoir combien de fois c'est plus rapide que le C :)



                                              Bisous, Nyu
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                27 mars 2006 à 22:06:45

                                                A mon avis en ASM c'est au mieux un score très légèrement meilleur au C dans le meilleur des cas.
                                                Les compilateurs de nos jours font généralement mieux les optimisations que le programmeur qui ferait directement de l'ASM.
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  27 mars 2006 à 22:44:40

                                                  J'allais le dire, mais jme suis fait griller :D

                                                  Tu me codes le truc en assembleur (tu prends un nombre, et tu affiches tous les nombres premiers (un par ligne) inférieurs ou égaux, avec un crible d'eratosthène) et je lance le bench, aucun problème.
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter

                                                  [Caml]Incrementation

                                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                  • Editeur
                                                  • Markdown