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

F# Discussion :

peut-on cacher des attributs dans un type union ?


Sujet :

F#

  1. #1
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 681
    Points
    18 681
    Par défaut peut-on cacher des attributs dans un type union ?
    Bonjour,


    Je vais (enfin) passer aux choses sérieuses... la forme SSA

    dans mon interprète très simpliste, j'ai décidé d'utiliser ce type pour mon ast


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    /// represents the Abstract Syntax Tree
    type struct_expr =
      |Intconst of int
      |Boolconst of bool
      |Test of string * struct_expr list
      |Operateur of string * struct_expr list
      |Var of string
      |Assign of struct_expr * struct_expr
      |If of struct_expr * struct_expr list * struct_expr list
      |While of struct_expr * struct_expr list
      |Break
      |Declare of string list
      |Assert of struct_expr
    with
      member this.immediate_dominator : struct_expr option = None
      member this.domination_frontier : struct_expr list = []
    ça me permet de jouer avec un match sur les éléments, mais j'aimerais aussi pouvoir avoir quelques petites infos cachées dont je vais avoir besoin pour le calcul de ma forme SSA à savoir :
    • le dominateur immediat
    • la frontière de domination



    le hic est qu'actuellement je ne peux modifier ces propriétés...
    comment feriez-vous sans trop changer la structure de l'ast ?


    nb : je n'ai volontairement pas séparé les instructions des expressions
    nb2 : je n'ai pas encore mis les phi et les attributs pour le renommage

  2. #2
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Points : 1 412
    Points
    1 412
    Par défaut
    Pour répondre au titre : non.

    Il y a plusieurs solutions. Tu peux stocker ces informations supplémentaires dans une structure externe, par exemple une table de hachage. Ce n'est pas très fonctionnel, mais ça peut te convenir.

    Tu peux aussi utiliser quelque chose comme :
    Code F# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    type struct_expr = {
      data: struct_expr';
      immediate_dominator: struct_expr';
      domination_frontier: struct_expr' }
    and struct_expr' =
      // ...

    Le pattern matching reste toujours possible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    function
     | {data=IntConst 42} -> ...
    Si c'est trop verbeux pour toi, tu peux toujours passer par des active patterns.

  3. #3
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 681
    Points
    18 681
    Par défaut
    effectivement, je n'avais pas pensé aux active pattern


    mais étant donné qu'il me faudra tout refaire, j'avais commencé par quelque chose de ce genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    type operateur =
      |Add |Sub |Mul |Div |Mod
     
    type test_operateur =
      |Lt |Le |Gt |Ge |Eq |Ne |Neg
     
    type variable = { name : string ; mutable indice : int option }
     
    type expression =
      |Intconst of int
      |Boolconst of bool
      |Op of operateur * expression list
      |Test of test_operateur * expression list
      |Var of variable
      |Phi of expression list
     
    type instruction = 
      |Entry |Exit
      |Assign of expression * expression
      |If of expression * struct_ast * struct_ast
      |While of expression * struct_ast
      |Break
      |Declare of variable list
      |Assert of expression
    and ast_cell = 
      { instr : instruction ; mutable prev : ast_cell Set ; mutable next : ast_cell Set ; mutable iDom : struct_ast ; mutable domF : ast_cell Set  }
    and struct_ast = ast_cell option
    je regarderai plus tard comment tenter de tranposer en active patterns

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

Discussions similaires

  1. Cacher des parametres dans l'URL method="get"
    Par ProgElecT dans le forum Langage
    Réponses: 8
    Dernier message: 09/12/2006, 23h40
  2. Cacher des éléments dans une zone de liste
    Par toto10 dans le forum IHM
    Réponses: 11
    Dernier message: 19/07/2006, 16h03
  3. Réponses: 2
    Dernier message: 27/03/2005, 17h09
  4. Comment peut on integer des controles dans un prog opengl
    Par franck31400 dans le forum OpenGL
    Réponses: 2
    Dernier message: 28/04/2004, 10h06
  5. Comment cacher des propriétés dans un nouvel objet ?
    Par Pedro dans le forum Composants VCL
    Réponses: 2
    Dernier message: 22/10/2003, 19h53

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