From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: weis Received: (from weis@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id LAA20360 for caml-redistribution; Tue, 8 Sep 1998 11:39:32 +0200 (MET DST) Received: from concorde.inria.fr (concorde.inria.fr [192.93.2.39]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id JAA10779 for ; Tue, 8 Sep 1998 09:08:16 +0200 (MET DST) Received: from pauillac.inria.fr (pauillac.inria.fr [128.93.11.35]) by concorde.inria.fr (8.8.7/8.8.7) with ESMTP id JAA10732; Tue, 8 Sep 1998 09:08:14 +0200 (MET DST) Received: (from weis@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id JAA03128; Tue, 8 Sep 1998 09:08:14 +0200 (MET DST) From: Pierre Weis Message-Id: <199809080708.JAA03128@pauillac.inria.fr> Subject: Re: right hand side of let rec To: lcheno@club-internet.fr (Laurent Ch=?ISO-8859-1?Q?éno?=) Date: Tue, 8 Sep 1998 09:08:14 +0200 (MET DST) Cc: caml-list@inria.fr In-Reply-To: <199809071512.RAA29199@front1.grolier.fr> from "Laurent Ch=?ISO-8859-1?Q?éno?=" at Sep 7, 98 05:15:05 pm X-Mailer: ELM [version 2.4 PL24 ME8] MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit Sender: weis > 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/