Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pattern-matching #3255

Closed
vicuna opened this issue Mar 12, 2002 · 4 comments
Closed

Pattern-matching #3255

vicuna opened this issue Mar 12, 2002 · 4 comments
Labels

Comments

@vicuna
Copy link

vicuna commented Mar 12, 2002

Original bug ID: 991
Reporter: administrator
Status: closed
Resolution: fixed
Priority: normal
Severity: minor
Category: ~DO NOT USE (was: OCaml general)

Bug description

Ca a peut-etre ete' deja` rapporte', mais ca surprend toujours:

    Objective Caml version 3.04+6 (2002-02-05)

let f (_ :: l | l) = l;;

val f : 'a list -> 'a list =

f [1;2;3];;

  • : int list = [1; 2; 3]

Si c'est trop dur a compiler selon l'intuition, il me semble qu'il
faudrait au moins un warning.

     Jacques
@vicuna
Copy link
Author

vicuna commented May 27, 2002

Comment author: administrator

From: Nicolas barnier barnier@recherche.enac.fr

Je suis tombé sur ce rapport de bug ouvert et sans suite :

let f (_ :: l | l) = l;;

val f : 'a list -> 'a list =

f [1;2;3];;

  • : int list = [1; 2; 3]

Si c'est trop dur a compiler selon l'intuition, il me semble qu'il
faudrait au moins un warning.

     Jacques

Mais c'est documenté :

6.6 Patterns

``Or'' patterns

[...] If both matchings succeed, it is undefined which set of
bindings is selected.

Ca n'est pas pire que des let ... = ... and ... = ... in ...
pour lesquels l'ordre n'est pas non plus spécifié, non ?

Ce n'est pas du meme ordre qu'on parle: dans un cas il s'agit de
l'ordre des effets de bord, dans l'autre cas de savoir a` quelle
partie d'un motif une variable va etre liee. Difficilement comparable
(dans les deux sens!)

Je crois que Luc est d'accord que ca devra etre arrange' un jour, mais
que ce n'est pas simple a` faire.
Mais est-ce qu'il n'y a pas un progres avec le nouveau warning sur les
motifs partiellement inutilises? Il suffit de noter que le second l
inclus un motif contenant le premier l pour detecter l'ambiguite'.

   Jacques

Compte tenu de ce que je sais de la compilation du PM, je pourrais
mettre un avertissement d'inutilite' dans ce cas tres pre'cis. La regle est extremement simple : si il y a une variable comme
argument d'un or-pat, tous les autres arguments du or-pat sont
inutiles...

Mais je pre'fe`re ne pas la faire afin de me laisser dans la te^te
qu'il faut changer la compilation. Si vous trouvez c,a idiot je met le
warning en cinq minutes.

--Luc

@vicuna
Copy link
Author

vicuna commented May 27, 2002

Comment author: administrator

Jacques Garrigue wrote:

Ce n'est pas du meme ordre qu'on parle: dans un cas il s'agit de
l'ordre des effets de bord, dans l'autre cas de savoir a` quelle
partie d'un motif une variable va etre liee. Difficilement comparable
(dans les deux sens!)

En fait, je pensais plus à ce type de construction qui permettrait à
un compilateur idoine de générer du code qui évalue les différentes
branches en parallèle. Mais effectivement, ce n'est pas ce qu'on
recherche avec le pattern matching : heureusement d'ailleurs que
l'ordre est spécifié sur les patterns standards...

Par ailleurs, je vois qu'on peut dérouter l'intuition encore plus :

    Objective Caml version 3.04

let f (_ :: l | l | _ :: _ :: l) = l;;

val f : 'a list -> 'a list =

f [1;2;3];;

  • : int list = [1; 2; 3]

C'est le genre de construction qu'on ne fait pas apprendre à nos
élèves...

-- Nicolas

@vicuna
Copy link
Author

vicuna commented May 27, 2002

Comment author: administrator

From: Nicolas barnier barnier@recherche.enac.fr

Je suis tombé sur ce rapport de bug ouvert et sans suite :

let f (_ :: l | l) = l;;

val f : 'a list -> 'a list =

f [1;2;3];;

  • : int list = [1; 2; 3]

Si c'est trop dur a compiler selon l'intuition, il me semble qu'il
faudrait au moins un warning.

     Jacques

Mais c'est documenté :

6.6 Patterns

``Or'' patterns

[...] If both matchings succeed, it is undefined which set of
bindings is selected.

Ca n'est pas pire que des let ... = ... and ... = ... in ...
pour lesquels l'ordre n'est pas non plus spécifié, non ?

Ce n'est pas du meme ordre qu'on parle: dans un cas il s'agit de
l'ordre des effets de bord, dans l'autre cas de savoir a` quelle
partie d'un motif une variable va etre liee. Difficilement comparable
(dans les deux sens!)

Je crois que Luc est d'accord que ca devra etre arrange' un jour, mais
que ce n'est pas simple a` faire.
Mais est-ce qu'il n'y a pas un progres avec le nouveau warning sur les
motifs partiellement inutilises? Il suffit de noter que le second l
inclus un motif contenant le premier l pour detecter l'ambiguite'.

   Jacques

@vicuna
Copy link
Author

vicuna commented Sep 24, 2003

Comment author: administrator

Apparemment corige' par Luc depuis un certain temps.

@vicuna vicuna closed this as completed Sep 24, 2003
@vicuna vicuna added the bug label Mar 19, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant