Re: Stream patterne matching

Michel Mauny (Michel.Mauny@inria.fr)
Wed, 17 Mar 1993 14:47:49 +0100 (MET)

Message-Id: <9303171347.AA17396@pauillac.inria.fr>
Subject: Re: Stream patterne matching
To: cr@dcs.ed.ac.uk
Date: Wed, 17 Mar 1993 14:47:49 +0100 (MET)
In-Reply-To: <4353.9303171131@campay.dcs.ed.ac.uk> from "cr@dcs.ed.ac.uk" at Mar 17, 93 11:31:10 am
From: Michel.Mauny@inria.fr (Michel Mauny)

> Ok, Si j'ai bien compris le fait d'abstraire une re`gle fait perdre des
> factorisations. Ce qui est illustre' par l'exemple suivant :
>
> #let E = function
> # [< '0; '1 >] -> true
> # |[< '0; '2 >] -> false;;
>
> est factorisable. Mais
>
> #let pp = function p -> function
> # [< '0; '1 >] -> true
> # |[< p _ ; '2 >] -> false;;
>
> ne l'est pas. Pourtant (pp (function [<'0 >] -> ())) est e'quivalent a` E.
>
> Es-je bien compris ?

Oui, tout a` fait.

> Pourtant, j'ai un doute. si l'on essaye E, on s'aperc,oit qu'il y a un cas
> inutilise dans le patterne matching. Une factorisation est donc ne'cessaire. Il
> faut la faire a la main ! Tandis que dans pp, le compilo ne bronche pas. caml
> fait donc de'ja une diffe'rence entre les deux.

Le compilo fait une diffe'rence et il peut envoyer un warning dans le
premier cas, alors que dans le second, il ne sait rien du tout.

> Ne pourrais t'on pas au moins faire la factorisation quand le compilo signale
> un cas inutilise' dans le matching ? Avec e'ventuellement un warning pour
> l'utilisateur ?

Il y a une diffe'rence importante entre envoyer un warning disant a`
l'utilisateur:

Attention: votre programme ne fait peut-e^tre pas ce que vous
attendez de lui!

et un autre disant:

Attention: j'ai CHANGE' votre programme de sorte qu'il fasse
ce que (je suppose) que vous attendez de lui!

J'exage`re un peu (de'sole'), mais l'important est que le comportement
des analyseurs actuels est uniforme, pas de cas particuliers, et cela
en facilite l'explication. Encore une fois, sur une notion plus
"declarative" de grammaires, je crois qu'on pourra faire beaucoup plus
de choses (analyses et optimisations) inte'ressantes.

> Mais l'essentiel n'est-il pas que si (pp p) est factorisable alors E(p') l'est
> aussi ? (cela esr vrai, je pense ?)

Oui, je crois que c'est vrai, mais c'est une e'quivalence qu'on
voudrait, car l'exemple d'abstraction de sous-expression que je
donnais dans mon message pre'ce'dent est re'versible en ``inlining''.
Ces manipulations (a` la main) de programmes sont tre`s courantes, et
il serait dommage qu'elles soient trop complexes a` cause de
subtilite's ope'rationnelles.

> Y a-t'il des exemples plus complexes ?

On doit tomber sur de ve'ritables casse-te^tes lorsqu'il s'agit de
traduire une grammaire BNF existante (Yacc ou whatever) en analyseurs
de Caml-Light, mais je n'ai personnellement que peu d'expe'rience en
la matie`re.

Michel