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

Caml Discussion :

Notations personnalisées pour des types crées.


Sujet :

Caml

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Notations personnalisées pour des types crées.
    Bonjour, est-il possible en caml de créer des notations pour de nouveaux types?
    Mettons que je re-codes les listes chaînées, puis-je noter mes listes (x0;...;xn) (correspondant à la notation [x0;...;xn] ) et caml m'afficher mes listes de cette façon (au lieu de quelque chose de la forme Noeud (x0, Noeud (x1, ... , Vide)) )?
    Aussi peut-on changer l'ordre de priorité de lecture d'une expression comme cela semble se produire pour l'opération :: (caml comprends que 1:: 2:: [] est 1:: (2:: []) et non pas (1:: 2):: [] )?
    Merci d'avance.

  2. #2
    Membre régulier
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    102
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 102
    Points : 110
    Points
    110
    Par défaut
    Salut !

    J'ai l'impression qu'il y a trois questions distinctes dans ta question. Malheureusement je ne vais pas être capable de répondre à la moindre d'entre elle, mais je peux te donner des mots clefs pour chacun d'entre eux, ce qui pourra peut-être t'aider.

    1. Tout d'abord, pour ce qui du comportement des opérateurs :
    Tu peux tout a fait définir tes propres opérateurs en OCaml. Malheureusement, le choix est assez contraint : en effet, le comportement de l'opérateur sera défini par son nom, et en particulier par son premier caractère : il déterminera aussi bien le caractère préfixe / infixe que la priorité et l'associativité de l'opérateur.
    Ca c'est pour la réponse courte et claire, après tu peux aussi jeter un coup d'oeil ici http://caml.inria.fr/pub/docs/manual...l#infix-symbol et ici http://caml.inria.fr/pub/docs/manual-ocaml/expr.html mais j'avoue que ce n'est pas forcément très clair...
    Voici un exemple complètement pourri :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #let ( +: ) a b = a :: b ;;
    val ( +: ) : 'a -> 'a list -> 'a list = <fun>
    # 1 +: 2 +: [] ;;
    Error: This expression has type int but an expression was expected of type int list
    # 1 +: (2 +: []) ;;
    - : int list = [1; 2]
    # let ( ^: ) a b = a :: b ;;
    val ( ^: ) : 'a -> 'a list -> 'a list = <fun>
    # 1 ^: 2 ^: [] ;;
    - : int list = [1; 2]
    Je trouve ça un peu dommage que l'utilisateur ait si peu de contrôle sur ses opérateurs mais bon...

    2. Pour ce qui est de faire des trucs plus complexes avec la syntaxe :
    C'est possible aussi, mais pas directement en OCaml. Il va te faloir utiliser des outils comme Camlp4 ou Camlp5. Je ne m'en suis jamais servi donc je n'en sais pas plus, mais il y a l'air d'avoir pas mal de doc sur le net.

    3. Pour ce qui est de personnaliser l'affichage de tes fonctions dans le toplevel :
    C'est possible aussi ! Mais là encore, j'ai jamais fait. Il va te falloir chercher soit du côté de Camlp4/Camlp5, soit du côté du module Format.

    Bonne chance !

  3. #3
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut version Light ou Objective ? quel numéro ?
    Cela nous faciliterait la tâche si vous pouviez systématiquement préciser Caml-Light ou OCaml.

    Parce qu'allez fouiner dans votre historique pour découvrir qu'on vous a donné la bonne réponse pour la mauvaise version c'est pas très valorisant pour nous et pas très pertinent pour vous.

    (ou alors nous donner le numéro de version de l'interpréteur, c'est encore mieux)

    Merci à tous.
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    @SpiceGuid: Si je n'ai pas précisé, c'est parce qu'usuellement j'utilise les deux.
    Surtout par l'intermédiaire de WinCaml (v5.4 - je suis sous windows). J'ai aussi la version 4.00.1 de OCaml installée sur ma machine.

    @drunkskater: Merci! Pour l'associativité des opérateurs c'est ce que je cherchais, même si c'est en effet frustrant d'avoir si peu de choix.
    Par contre pour le reste (Camlp4...) je n'ai pas bien compris, mais dans l'ensemble j'ai l'impression que cela sert à modifier globalement la syntaxe du langage.
    Je ne veux pas du tout faire cela mais juste avoir une notation personnalisée pour un type que je crée: faire exactement pareil que ce qui est fait pour les listes.
    Il y a un moment j'avais demandé sur ce forum s'il était possible de voir comment les primitives du module List étaient codées, en fait j'aimerais voir comment ce type est déclaré: ça me semblerait logique que les notations spéciales aux listes y soient déclarées dans le même temps.
    En tout cas merci pour ta réponse.

  5. #5
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut En OCaml 3.12.1
    • Le type 'a list n'est pas déclaré dans le module List.
    • Le module Pervasives utilise le type 'a list pour coder l'opérateur @.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    # (::);;
    Error: Syntax error
    • Donc :: n'est même pas un opérateur de type 'a -> 'a list -> 'a list.
    En fait :: est probablement hardcodé dans l'analyseur syntaxique.

    Par contre, en Coq, :: est un opérateur ordinaire, déclaré dans le module Coq.Lists.List.
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par SpiceGuid Voir le message
    En fait :: est probablement hardcodé dans l'analyseur syntaxique.
    Bien, alors du coup ça n'est pas possible (sauf bidouillages peu ragoutants).
    Merci.

  7. #7
    Membre régulier
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    102
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 102
    Points : 110
    Points
    110
    Par défaut
    Citation Envoyé par Helvyeah Voir le message
    Bien, alors du coup ça n'est pas possible (sauf bidouillages peu ragoutants).
    Merci.
    Ben justement, je crois que c'est exactement à ça que servent Camlp4 / Camlp5 ! Et ça a l'air assez puissant, donc ça vaut peut-être le coup d'y jeter un coup d'oeil (ceci dit ça fait longtemps que je me suis dit ça et je n'en ai jamais eu le courage donc je comprendrai si tu dis "Nan mais c'est pas si grave" )

    Et pour l'affichage personnalisé, je suis à peu près sûr que c'est possible sans avoir recours à Camlp4 ou Camlp5. Un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # #require "lacaml" ;;
    # let t = Lacaml.D.Vec.random 3 ;;
    val t : Lacaml.D.vec =        R1       R2        R3
                           -0.459497 0.195646 -0.425896
    Et je crois pas que ça utilise Camlp4 / Camlp5. Si tu as le courage tu peux regard ici : https://bitbucket.org/mmottl/lacaml/...ce23506b2/lib/
    Je pense que ça doit être dans io.ml, mais j'ai pas vraiment vérifié.

    Sinon, si jamais tu veux jeter un coup d'oeil à l'implémentation d'OCaml :

    http://caml.inria.fr/svn/ocaml/trunk/stdlib/

    (Mais pour ma part j'ai toujours été déçu (en gros à chaque fois les questions que je me posais c'était "mais comment cette fonction fait-elle pour être polymorphe (ex: min...) et en fait c'était pas codé en OCaml... )

Discussions similaires

  1. [MySQL] Quel nom choisir pour des type radio dynamique ?
    Par bullrot dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 31/10/2008, 14h06
  2. [Free Pascal] Suppression des messages hint pour des types File
    Par bubulemaster dans le forum Free Pascal
    Réponses: 5
    Dernier message: 03/09/2008, 21h18
  3. Réponses: 3
    Dernier message: 19/10/2007, 14h32
  4. Mysql : choix des types pour les champs entre :
    Par Thierry8 dans le forum Administration
    Réponses: 3
    Dernier message: 14/06/2006, 08h22

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