10
votes

Comment appendez-vous un caractère à une chaîne dans OCAML?

Il semble qu'il n'y ait aucune fonction dans la bibliothèque standard de type char -> chaîne -> chaîne , qui insère un char devant (ou à la fin de) a chaîne . Il y a des solutions de contournement, par exemple En utilisant string.make ou string.blit . Y a-t-il un moyen élégant de faire cela?


1 commentaires

Utilisation de la mémoire tampon est probablement plus appropriée pour la culture des chaînes.


3 Réponses :


8
votes

string.make et string.blit 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 et de la concaténation de chaîne: xxx


3 commentaires

Je dirais char.escaped 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 est probablement ce que vous voulez. Cela semble un peu maladroit. Les piles ont battring.of_char .


Merci pour la clarification sur Char.Escaped . 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?



18
votes

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 char.scaped ; 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: xxx

update

Dans les années qui ont été posées, OCAML a changé ainsi ces chaînes sont immuables. Excellent.


0 commentaires

8
votes

J'ai fait une comparaison de l'efficacité des différentes approches:

  1. J'ai écrit un test simple: XXX

  2. Je l'ai compilé nativement (Intel Core 2 Duo).

  3. J'ai dirigé le test trois fois pour chaque option, la synchronisation avec TIME et calculer la moyenne réelle écoulée.

    Voici les résultats:

    1. s ^ string.make 1 C : 7.75S ( 100% )

    2. s ^ char.escaped C : 8.30 ( 107% )

    3. printf.sprintf "% s% c" s c : 68.57S ( 885% )


3 commentaires

Juste pour noter, encore une fois: char.escaped ne fait pas la même chose que string.make . 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' ) 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 . Naturellement printf.sprintf 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' = "\\ n" .


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' vous donne une chaîne de deux caractères constituée de '\\' et 'n' . string.make 1 '\ n' vous donne une chaîne d'un caractère composée de '\ n' , ce qui est plus susceptible d'être ce que vous voulez.