IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Haskell Discussion :

usage de l'interpréteur


Sujet :

Haskell

  1. #1
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut usage de l'interpréteur
    Bonsoir,

    voulais passer ma soirée à explorer Haskell pour la toute première fois (je suis en train de lire The Haskell Road to Logic, Mathematics and Programming et le premier chapitre me plaît bien).

    Quand je charge mes exemples et autres tests depuis un fichier l'interpréteur reconnaît bien les fonctions. Mais je n'arrive pas à déclarer de fonctions en ligne (comme avec irb, l'interpréteur ruby).

    Volià ce que disent hugs et ghc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Hugs.Base> makeList = 1 : makeList
    ERROR - Syntax error in input (unexpected `=')
     
    Prelude> makeList = 1 : makeList
    <interactive>:1:9: parse error on input `='
    J'ai raté quelque chose, mais quoi ?

  2. #2
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    Bah, j'ai trouvé une solution (au moins provisoirement) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Hugs.Base> :s -Eemacs
    Hugs.Base> :e GS1.hs
    Hugs.Base> :l GS1.hs
    ...
    Hugs.Base> :e
    ...

  3. #3
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut
    Dans un REPL, utilise une expression let:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    > let x = 10
    > x + x
    20

  4. #4
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    En fait GHCi (ou Hugs dans ton cas je suppose, bien que je ne connaisse pas vraiment Hugs) ne seraient pas très pratique si ils ne pouvaient pas faire des entrées/sorties et des effets de bords, ils sont donc dans la monade IO. En pratique ça signifie que tu ne peux pas juste coller du code de top-level dans la REPL et que ça marche.
    Entre autre, pour déclarer une variable ou une fonction, tu dois utiliser let{}. En contrepartie tu peux utiliser toutes les fonctions de la monade IO comme putStr, print, ... Tu peux également taper toute expression Haskell valide, l'interpréteur le mettra dans IO automatiquement, par exemple tu peux utiliser let ... in ..., appliquer des fonctions, etc.

    Pour ma part, j'utilise haskell-mode pour Emacs, ainsi je tape la plupart des fonctions et autres déclarations de types de données dans un script Haskell puis je charge ce script dans GHCi (C^c C^l) et je teste mes fonctions ou éventuellement mon main dans l'interpréteur. C'est très confortable et j'ai toute la puissance d'Emacs à portée de la main. J'ai cru comprendre qu'il y avait la même chose pour Vi.

    NB : Pour une liste des commandes "spéciales" accessible dans l'interpréteur, tape :help au prompt, tu as des trucs intéressant dans le tas.
    --
    Jedaï

  5. #5
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    Impeccable, merci (à vous deux).

    Pour l'instant je teste mes essais avec hugs et ghci (hmm, ghc a mis presque trois heures à compiler sur mon portable ). Avec emacs comme éditeur, bien sûr (je n'ai jamais pu me faire à vi). Vais installer l'haskell-mode de ce pas.

    Etrangement hugs refuse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >let { divides d n = rem n d == 0 }
    ERROR - Syntax error in expression (unexpected end of input)
    alors que ghci ne fait pas de problème.

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Je remets ca au goût du jour (c'est-à-dire la différence entre HUGS et GHCi).

    Avez vous une solution ?

  7. #7
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par Garulfo Voir le message
    Je remets ca au goût du jour (c'est-à-dire la différence entre HUGS et GHCi).

    Avez vous une solution ?
    Une solution ? Une solution à quoi exactement ? GHCi est bien plus maintenu que Hugs, plus performant et a plus de fonctionnalités, je me sers exclusivement de lui. Le seul avantage de Hugs c'était les messages d'erreurs un peu plus faciles à comprendre pour un débutant mais GHC fait des progrès dans le domaine et pour un usage avancé, ça n'a pas bien d'importance.

    Pourquoi demandes-tu cela ? Tu t'intéresse au potentiel pédagogique de Hugs ?

    --
    Jedaï

  8. #8
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par Jedai Voir le message
    Une solution ? Une solution à quoi exactement ?
    Au problème mentionné par iblis.

    Citation Envoyé par Jedai Voir le message
    GHCi est bien plus maintenu que Hugs, plus performant et a plus de fonctionnalités, je me sers exclusivement de lui. Le seul avantage de Hugs c'était les messages d'erreurs un peu plus faciles à comprendre pour un débutant mais GHC fait des progrès dans le domaine et pour un usage avancé, ça n'a pas bien d'importance.

    Pourquoi demandes-tu cela ? Tu t'intéresse au potentiel pédagogique de Hugs ?
    Personnellement j'utilise GHCi... mais il se trouve que dans mon département, GHC demande une intervention humaine plus complexe pour l'installation que Hugs (Hugs est supporté par blastwave). Vu que je préfère éviter de demander une tâche supplémentaire à l'analyse responsable de l'installation des logiciels (car il a bien assez de travail), j'aimerais m'en tenir à Hugs. C'est la seule raison.

    Tous les tutoriaux que j'ai parcourus — ça fait pas des millions, juste quelques uns — partent du principe qu'on édite les scripts à partir de hugs et qu'on les charge avec load... parfois ce n'est pas précisé, ce qui est très fatiguant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    let f n = n + 1
    let { f n = n + 1 }
    ne marchent pas... qu'est ce qu'il faut faire pour utiliser l'interpréteur? S'ils vous charger à chaque fois, c'est assez inutile.

    Je trouve que l'interpréteur est un peu chiant. Devoir avoir des programmes différents des scripts est toujours ennuyeux. Menfinbon je survivrais

  9. #9
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par Garulfo Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    let f n = n + 1
    let { f n = n + 1 }
    ne marchent pas... qu'est ce qu'il faut faire pour utiliser l'interpréteur? S'ils vous charger à chaque fois, c'est assez inutile.

    Je trouve que l'interpréteur est un peu chiant. Devoir avoir des programmes différents des scripts est toujours ennuyeux. Menfinbon je survivrais
    Sur GHCi, les deux lignes que tu as donné marche très bien. Si elles ne marchent pas sur Hugs, c'est un bug.

    Même s'il faut charger à chaque fois, ce n'est pas inutile du tout : d'une part tu ne charges que les modules qui ont changé (avec analyse automatiques des dépendances), ce qui veut dire que les temps de chargement sont toujours extrêmement courts et ne gênent pas, d'autre part tu peux toujours évaluer n'importe quelle expression, ce qui est tout de même l'usage principal d'un interpréteur (vérifier comment tes fonctions et ton programme marchent).

    Si tu veux définir des choses, ce n'est pas non plus une syntaxe complètement différente du Haskell standard, c'est juste la syntaxe utilisée dans un bloc "do".

    Autoriser n'importe quelle expression de top-level dans l'interpréteur pose un certain nombre de problèmes, entre autre contrairement à la plupart des langages informatiques, tous les programmes Haskell sont conçus pour être compilé par module entier, toutes les déclarations dans un modules sont potentiellement mutuellement récursives, etc...
    C'est certainement possible, mais ce n'est pas non plus évident et on serait obligé d'introduire quelques constructions supplémentaires pour indiquer la fin d'une entrée par exemple.


    Comme je te l'ai dit, à partir du moment où tu as un éditeur qui prend en charge Hugs/GHCi, ce n'est vraiment pas un problème (d'ailleurs franchement, même dans d'autres langages je ne travaille pratiquement pas à partir de l'interpréteur, j'écris mes définitions dans un éditeur et j'évalue uniquement des expressions dans l'interpréteur, travailler dans la boucle d'interaction de OCaml ? très peu pour moi, merci !).

    --
    Jedaï

  10. #10
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par Jedai Voir le message
    Sur GHCi, les deux lignes que tu as donné marche très bien. Si elles ne marchent pas sur Hugs, c'est un bug.
    [...]
    Je sais qu'elles marchent sur GHCi... mais elles ne marchent pas sur Hugs !
    C'était ça le problème mentionné par iblis et c'est ça qui se passe chez nous sur les SUN. Si c'est un bug, il est majeur me semble-t-il !

    À mon avis c'est très volontaire.

    Pour le fonctionnement de l'interpréteur, je ne dis pas que c'est anormal. Je dis simplement que, pour moi probablement plus que pour certains, un interpréteur est là pour éviter que tu n'utilises un fichier et que tu ais à le compiler (ou le charger dans ce cas). L'interpréteur offre une possibilité de faire des manipulations faciles à moindre coût. Le bug (puisque tu dis que s'en est un) est bien génant ! Pas de fonction qu'on puisse définir au top–level. Et devoir changer de syntaxe entre l'interpréteur et le compilateur, n'aide pas à l'expérimentation

    C'est pas la fin du monde. C'est surmontable... mais c'est perdre un peu de l'intérêt d'un interpréteur. Il est vrai que d'un autre côté, quand ça devient plus sérieux, on recourt tous à un fichier... donc ce « problème » s'efface.

  11. #11
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par Garulfo Voir le message
    À mon avis c'est très volontaire.
    Apparemment tu as raison : Hugs ne supporte pas les let isolés ainsi dans l'interpréteur... C'est très regrettable à mon avis.

    GHC propose des binaires pour Solaris pour Sparc comme pour x86, il ne devrait donc pas être si difficile de l'installer sur Solaris, mais il n'est effectivement pas pour l'instant disponible sur BlastWave. N'ayant pas pour ma part de Solaris installé (ni de Sparc à portée de la main), je ne me lancerais pas dans le support d'un tel paquetage, mais avec les binaires déjà disponibles, ce ne devrait pas être un tel problème.

    --
    Jedaï

  12. #12
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par Jedai Voir le message
    Apparemment tu as raison : Hugs ne supporte pas les let isolés ainsi dans l'interpréteur... C'est très regrettable à mon avis.
    C'est assez bizarre même... ça me semble contreproductif hélas. Bah c'est une bonne raison de n'utiliser que GHC

    Citation Envoyé par Jedai Voir le message
    GHC propose des binaires pour Solaris pour Sparc comme pour x86[...]
    L'analyste pourrait le faire. Mais j'aurais préférer ne pas l'ennuyer avec ça. En tout cas, vu que je compte bien insérer du ocaml, du haskell et du ruby, il va falloir faire avec -_-

    Merci bien en tout cas

Discussions similaires

  1. Interpréteur d'assembleur
    Par JOYE dans le forum Assembleur
    Réponses: 11
    Dernier message: 24/03/2004, 15h42
  2. Créer un interpréteur de langage inspiré du Basic
    Par Picasso dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 11/05/2002, 17h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo