2017-07-26 4 views
0

Je suis très nouveau à Ocaml et ML en général et j'ai eu un problème très fondamental. J'utilise une correspondance de modèle et dans un match je voudrais imprimer deux ou plusieurs déclarations concaténées. Par exemple. chan^"("^var^")"^op2^(poc p); chan^"("^var^")"^op^(poc p)Ocaml imprimer une déclaration après l'autre

let processoperatorchange2 t2s2 proc2 op op2= 
    let rec poc2 p = match p with 
    | Zero -> "0" 
    | Pproc (x) -> String.lowercase x 
    | In(chan, var, _, p, _) -> chan^"("^var^")"^op^(poc2 p); chan^"("^var^")"^op2^(poc2 p) 
    in poc2 proc2 

Mais chaque fois que je lance ceci, la seule déclaration imprimée est le dernier après le côlon demi. Puis-je obtenir de l'aide avec ça?

+0

Pourriez-vous ajouter toute l'expression de correspondance? De votre question, je peux deviner que vous renvoyez une chaîne au lieu de l'imprimer. – nefas

+0

Salut, oui je viens d'éditer la question avec le code. Le problème est que la chaîne concaténée est une combinaison de différents types définis par l'utilisateur donc pour l'instant je l'imprime simplement mais chaque fois que j'attribue une variable, elle renvoie l'unité et je suis incapable de l'imprimer – user1514567

Répondre

1

Votre fonction n'imprime pas une instruction mais génère une chaîne, elle renvoie donc une valeur et n'effectue aucun effet secondaire. L'opérateur de point-virgule, lorsqu'il est intercalé entre deux expressions, ne combine pas la valeur produite à partir de ces expressions, donc si vous avez "hello"; "world" le résultat est "world". C'est ce qui se passe dans votre cas quand vous le faites

chan^"("^var^")"^op^(poc2 p); chan^"("^var^")"^op2^(poc2 p) 

Tout ce qui est sur l'ascenseur est simplement jeté.

Une solution rapide serait de les concaténer, par exemple,

chan^"("^var^")"^op^(poc2 p)^";\n"^chan^"("^var^")"^op2^(poc2 p) 

Mais en général, un moyen idiomatiques d'imprimer AST est d'utiliser le module Format, et mettre en œuvre une fonction pp récursive, qui est de type Format.formatter -> 'a -> unit . Notez le type de retour, la fonction ne construit pas de chaîne (c'est généralement une opération de complexité quadratique), mais l'imprime plutôt dans un flux de sortie générique.

+0

Salut, merci beaucoup pour le pointeur . Je vais essayer l'option Format.Formatter. Merci! – user1514567

+0

Bonjour, j'ai une question de suivi. En supposant que je voulais construire cette chaîne dans ma question afin de l'ajouter à un ensemble, quelle est la meilleure approche? En ce moment je l'imprime mais que se passe-t-il si je veux l'assigner à une variable de type chaîne? Chaque fois que je le fais de cette façon, il retourne l'unité – user1514567

+0

Vous pouvez utiliser la fonction Format.asprintf pour imprimer en chaîne. – ivg