Il semble qu'il n'y ait aucune fonction dans la bibliothèque standard de type char -> chaîne -> chaîne code>, qui insère un
char code> devant (ou à la fin de) a
chaîne code>. Il y a des solutions de contournement, par exemple En utilisant
string.make code> ou
string.blit code>. Y a-t-il un moyen élégant de faire cela? P>
3 Réponses :
string.make code> et
string.blit code> est un bon moyen de le faire, mais ils semblent être impératifs. Personnellement, je préfère faire des fonctions d'infixsiements à l'aide de
char.escaped code> et de la concaténation de chaîne:
Je dirais char.escaped code> est destiné aux utilisations spécialisées telles que la génération de code OCAML comme sortie ou écrire des messages lisibles humains. Pour les cas ordinaires,
string.make 1 C code> est probablement ce que vous voulez. Cela semble un peu maladroit. Les piles ont
battring.of_char code>.
Merci pour la clarification sur Char.Escaped code>. Je garde la réponse inchangée pour que d'autres sachent.
Pourquoi faire évoluer quand tout est rendu de la réponse et du commentaire de @ Jeffreyscofield?
Le code de @Pad est ce que j'utiliserais, car j'aime traiter des chaînes comme étant immuables si possible. Mais je n'utiliserais pas update strong> p> Dans les années qui ont été posées, OCAML a changé ainsi ces chaînes sont immuables. Excellent. P> p> char.scaped code>; Il est spécialisé pour quand vous voulez la représentation lexicale OCAML d'un personnage. Voici donc ce que vous obtenez si vous faites ce changement:
J'ai fait une comparaison de l'efficacité des différentes approches:
J'ai écrit un test simple: p>
Je l'ai compilé nativement (Intel Core 2 Duo). P> LI>
J'ai dirigé le test trois fois pour chaque option, la synchronisation avec Voici les résultats: p> TIME CODE> et calculer la moyenne réelle em> écoulée. P> LI >
ol>
s ^ string.make 1 C code>: 7.75S ( 100% fort>) p> li>
s ^ char.escaped C code>: 8.30 ( 107% strong>) p> li>
printf.sprintf "% s% c" s c code>: 68.57S ( 885% fort>) p> l> li>
ol> p>
Juste pour noter, encore une fois: char.escaped code> ne fait pas la même chose que
string.make code>. Il crée une valeur "échappée" pour le caractère, selon les règles lexicales d'OCAML. Pour voir cela, essayez d'ajouter une nouvelle ligne (
'\ n' code>) de cette façon. C'est aussi pourquoi il est un peu plus lent. Pour la plupart des objectifs généraux, vous souhaitez utiliser
string.make 1 C code>. Naturellement
printf.sprintf code> est beaucoup plus lent, mais incroyablement flexible.
@Jeffreyscofield Je vais simplement ajouter ceci, alors les gens n'ont pas besoin de l'essayer eux-mêmes: char.escaped '\ n' code> =
"\\ n" code>.
Merci, peut-être que j'aurais dû dire cela moi-même! Ces commentaires sont limités pour être très brefs. Quoi qu'il en soit: char.escaped '\ n' code> vous donne une chaîne de deux caractères constituée de
'\\' code> et
'n' code>.
string.make 1 '\ n' code> vous donne une chaîne d'un caractère composée de
'\ n' code>, ce qui est plus susceptible d'être ce que vous voulez.
Utilisation de la mémoire tampon code> est probablement plus appropriée pour la culture des chaînes.