10
votes

Pourquoi utiliseriez-vous une règle de proto dans une grammaire Perl 6?

Voici deux grammaires. On utilise un jeton de proto code> et on ne le fait pas. Ils ont tous deux la même chose. Ce sont fondamentalement les exemples de S05 sous "variable (non) interpolation" . Dans cet exemple simple, ils sont tous deux capables de faire les mêmes choses.

Quelles sont les situations justifient tout le tapé supplémentaire? Les jetons proto code> ont des méthodes distinctes dans la classe d'action et peut-être un petit avantage là-bas. Cependant, vous devez taper des choses supplémentaires pour obtenir cet avantage. P>

existe une partie de proto code> qui rend d'autres parties de la grammaire plus facile? P>

------No proto parsing
found sigil: $
found identifier: butterfuly
found variable: $butterfuly
------Yes proto parsing
found sym sigil: $
found identifier: butterfuly
found variable: $butterfuly


0 commentaires

3 Réponses :


11
votes

Techniquement, un proto sera préparé pour vous si vous ne le spécifiez pas vous-même. Il crée fondamentalement le gestionnaire de distribution multi-méthodes pour ce jeton (tel qu'il le fait avec sous et méthode ). Que vous n'avez généralement pas besoin de vous soucier.

Pourquoi spécifieriez-vous un proto ? Je peux penser à un certain nombre de raisons:

  1. Parce que vous voulez que le jeton s pour partager des traits
  2. Parce que vous voulez exécuter du code avant ou après l'expédition

    oui, le {*} peut contenir du code exécutable. Le quel que soit indique l'envoi du candidat approprié. Montrant cela dans une situation plus simple avec sous : xxx

    montre: xxx

    espère que cela aide: -)


1 commentaires

Ah ok. Mais pourquoi la méthode sigil dans la classe d'action est-elle appelée? Je peux voir une utilisation pour cela en dehors des grammaires, mais j'essaie de penser à une affaire à l'intérieur de grammaires. Les exemples que j'ai vus n'ont pas été complexes, ou ils ont été cultes de cargaison.



8
votes

Avoir la méthode appelle dans une classe d'actions peut être utile pour séparer la logique. Il est fondamentalement le même genre d'idée que Multiméthodes sauf pour les grammaires.

(I a écrit ce Pour évaluer les réponses à un Golf ) P>

grammar Mathmania-Plus is Mathemania {
  token op:sym<negate> { n }
  token op:sym<abs>    { a }
}

class Calculate-Plus is Calculate {
  method op:sym<negate> ($/) { make &prefix:<-> }
  method op:sym<abs>    ($/) { make &abs }
}


1 commentaires

Donc, pour un sous-grammaire (grammaire | classe), vous n'avez pas à remplacer ou à prolonger des méthodes. C'est bien des choses.



8
votes

Un avantage de fractionnement de vos alternatives dans un proto et une multis est que vous pouvez l'étendre plus de manière fiable. Vous pouvez ajouter des multis au proto existant dans une grammaire qui hérite de la grammaire qui déclare le proto, et vous n'avez pas besoin d'énumérer toutes les alternatives possibles (que vous auriez à faire dans le cas d'une seule règle).

Cela signifie que vous pouvez même avoir plusieurs extensions indépendantes à la même grammaire, par exemple en mélangeant plusieurs règles qui fournissent des multis à différents symboles pour correspondre.

Il s'agit fondamentalement du mécanisme que Perl 6 utilise lui-même lorsque vous définissez un opérateur personnalisé: il existe des règles pour correspondre aux différents types d'opérateurs (comme l'infixe, le préfixe, le postfix, ...) et la déclaration d'un nouvel opérateur dérive Nouvelle grammaire de l'actuellement actif, avec un candidat multiple ajouté pour le nouvel opérateur. Un script peut importer des opérateurs de plusieurs modules qui ne se connaissent pas les uns des autres grâce à l'extensibilité du mécanisme de jeton de proto.


0 commentaires