11
votes

Est-il possible de reproduire l'interpolation de cordes de Python dans OCAML?

en python, on peut utiliser PrintF comme formatage avec l'opérateur "%": xxx pré>

ou p> xxx pré>

est là? Pour obtenir la même syntaxe concise dans OCAML, pour un nombre arbitraire d'arguments? p>

Pour un seul argument, les travaux suivants: P>

let (%) = Printf.sprintf in ... "i am %d years old" % 99


0 commentaires

4 Réponses :


1
votes

En théorie, il ne semble pas plus difficile d'utiliser un format pour produire le type (typ1 * typ2 * ... * tynn) -> chaîne que typ1 -> typ2 -> ... -> tynn -> chaîne . C'est peut-être, à l'exception des formats récursifs % (% FMT) . Est-ce que quelqu'un utilise réellement ceux?

Dans la pratique, cependant, les implémentations OCAML ont choisi cette dernière forme et mis en œuvre des hacks de type système pour cette forme, pas pour l'ancien. Je crains donc que la réponse soit à peu près du compilateur, vous êtes coincé avec le Curçu forme de substitution de chaîne de format.


0 commentaires

8
votes

Cela dépend de ce que vous entendez par nombre arbitraire d'arguments:

  • Je ne crois pas qu'il existe un moyen d'écrire une fonction dans OCAML qui peut accepter et décompresser em> un tuple d'arbitraire arbitraire (par exemple, les deux (1, "Bob ") code> et (" joe "," bob "," briggs ") code>). p> li>

  • Le moyen de manipuler de multiples arguments est pas em> à travers des tuples, mais par Currying. Si vous êtes prêt à faire cela, vous pouvez simplement utiliser printf.sprintf code>. P> li>

  • Si vous voulez vraiment un opérateur d'infixe, par exemple, quelque chose comme p>

    ("%s-%s %s is the best movie reviewer" % "joe") "bob" "briggs"
    


0 commentaires


0
votes

Vous pouvez le faire par préfixe op, au lieu d'infixer: xxx

si vous voulez juste une manière concise d'écriture Sprintf, il suffit de "

comme Tobu a mentionné que vous avez besoin de P4 si vous voulez python comme la syntaxe spéciale. Je crois que ce doit être trop compliqué.


0 commentaires