6
votes

Comment faire correspondre, en match dans la raquette?

Si j'ai quelque chose comme ça (définir s (hi, là)) alors comment puis-je écrire en match Comme (correspond à S [(, h, t)] ...) Mais cela ne fonctionne pas, car correspond nécessite le , alors comment puis-je faire cela?


4 commentaires

Pardonnez le commentaire non sollicité, mais il me semble que l'utilisation de «match» de Raquette à analyser la contribution contenant des virgules n'est probablement pas une bonne idée; À moins que le reste de l'entrée est vraiment très très proche de Racket / Lisp, cela ressemble à un cas pour mordre la balle et utiliser un analyseur réel. Toutes mes excuses à l'avance si j'ai mal compris votre cas d'utilisation.


@Johncements Je pense que vous avez raison .. Et l'histoire est que mon programme principal est écrit dans une raquette et je veux juste obtenir les structures de données construites de l'analyse du fichier dans la raquette. Le fichier ressemble presque à S-exp, puis jusqu'à très tard, j'ai trouvé qu'il y avait des virgules ...


Avez-vous un type de spécification pour quelles formes peuvent survenir dans le fichier source? Le fichier source est-il écrit dans une langue bien connue?


@Johncements Nope, aucune spécification des formes des fichiers de tiers ... ils ne sont que du texte. Peut-être que je pourrais utiliser SED ou Awk pour analyser le texte ou utiliser n'importe quelle langue pour analyser la ligne de fichiers par ligne, mais il suffit de penser que le lire dans raquette peut simplement les lire dans et pour chaque (quelque chose ) , je peux facilement extraire des champs, puis rencontrer le problème des virgules :)


3 Réponses :


7
votes

Notez d'abord que la virgule , code> est une abréviation de lecteur spécial. Le (hi, là) code> est une lecture comme (hi (non-là-bas)) code>. C'est difficile à repérer - puisque l'imprimante par défaut imprime des listes dont le premier élément est un incote code> d'une manière particulière.

> (define s '(hi,there))
> (match s [(list h (list 'unquote t)) (list h t)])
(list 'hi 'there)


0 commentaires

2
votes

Utilisez une barre oblique inverse si vous souhaitez utiliser une virgule comme symbole à l'intérieur d'une section citée: xxx

et utilisez '|, | pour le symbole de la virgule autonome . xxx

dans les deux cas, vous devez utiliser vraiment des espaces pour séparer les choses et utiliser des listes.

(salut, là )) n'est pas une raquette valide.


1 commentaires

La raison en est que la virgule est que le fichier que je suis analysant l'utilise pour séparer beaucoup de choses et que je souhaite utiliser une correspondance de raquette pour analyser le fichier (en fait plus intéressé quand j'ai trouvé que la virgule est si spéciale dans la raquette!) Mais merci pour les réponses de vos gars)



1
votes

Je pense que vous pourriez être confondu à propos de l'endroit où vous avez besoin de virgules. Dans Racket, vous n'utilisez pas de virgules pour séparer des éléments dans une liste. Au lieu de cela, vous utilisez simplement des espaces. Dis-moi si c'est faux, mais ce que j'imagine, c'est que vous essayez de faire correspondre une expression comme (définir s '(salut là-bas)) code>. Pour ce faire, vous utiliseriez

(match s
  [`(,h ,t) ...])


1 commentaires

Je veux juste profiter de match dans raquette pour analyser le format S-Expression avec une virgule à l'intérieur de la parenthèse.