Mailing list for all users of the OCaml language and system.
 help / color / mirror / Atom feed
From: Pierre Weis <Pierre.Weis@inria.fr>
To: lcheno@club-internet.fr (Laurent Chéno)
Cc: caml-list@inria.fr
Subject: Re: right hand side of let rec
Date: Tue, 8 Sep 1998 09:08:14 +0200 (MET DST)	[thread overview]
Message-ID: <199809080708.JAA03128@pauillac.inria.fr> (raw)
In-Reply-To: <199809071512.RAA29199@front1.grolier.fr> from "Laurent Ch=?ISO-8859-1?Q?éno?=" at Sep 7, 98 05:15:05 pm

> let cycle_of_list l =
> 	let rec r = { val = hd l ; succ = r ; pred = r }
> 	in
> 	do_list (function x -> ignore (ajoute_au_cycle r x)) (tl l) ;
> 	r ;;
> #Entrée interactive:
> >	let rec r = { val = hd l ; succ = r ; pred = r }
> >	                    ^^^^
> Ce genre d'expressions n'est pas autorisé comme membre droit d'un "let rec".
> 
> 
> Bien sûr, j'ai contourné la difficulté en écrivant
> 
> let cycle_of_list l =
>      let hd_l = hd l
>      in
>      let rec r = { val = hd_l ; succ = r ; pred = r }
>      in
>      do_list (function x -> ignore (ajoute_au_cycle r x)) (tl l) ;
>      r ;;
> 
> Mais pourquoi Caml est-il si malheureux ?

Parceque Caml ne veut pas faire bus error! On n'a pas le droit aux appels
de fonctions dans les membres droits de let rec de valeurs parceque
ces appels de fonction pourraient produire de telles erreurs en
accèdant à des morceaux non encore contruits des valeurs définies
récursivement. Un petit exemple expliquera le problème. Quelle est la
valeur de y dans

let rec x = 1 :: y
and y = tl x;;

ou même celle de x définit pas
let rec x = 1 :: tl x;;

Dans les deux cas cette indétermination de la valeur définie se
traduirait par une erreur à l'exécution (en modifiant peut-être un peu
l'exemple dans certaines implémentations).

C'est pourquoi on n'a le droit dans les définitions récursives qu'à
des constructions de valeurs (appels à des constructeurs, construction
de couples, d'enregistrements, références à des valeurs déjà construites
ou définies récursivement), à l'exclusion d'appels de fonctions. Cela
garantit la construction correcte des valeurs récursivement
définies. Caml est heureux de vous fournir cette garantie, et il est
d'ailleurs très heureux d'être le seul système ML (non paresseux) à
vous fournir des définitions récursives de valeurs...

> ------- poor english
> 
> the later program causes an error : unauthorised expression in rhs of "let rec"
> why ?

Because no function calls are authorised in right hand sides of let
rec. This is simply because this constraint ensures that recursively
defined values can be properly built with no bus error
problem. Consider for instance:

let rec x = 1 :: tl y
and y = tl x;;

or

let rec x = 1 :: tl (tl x);;

That's why Caml is proud to (statically) prevent this situation, and
offer you the recursive definition of non functional values (which is generally
forbidden by ML compilers).

Pierre Weis

INRIA, Projet Cristal, Pierre.Weis@inria.fr, http://cristal.inria.fr/~weis/







      reply	other threads:[~1998-09-08  9:39 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1998-09-07 15:15 Laurent Chéno
1998-09-08  7:08 ` Pierre Weis [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=199809080708.JAA03128@pauillac.inria.fr \
    --to=pierre.weis@inria.fr \
    --cc=caml-list@inria.fr \
    --cc=lcheno@club-internet.fr \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox