From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (from weis@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id UAA27304 for caml-red; Thu, 22 Jun 2000 20:33:53 +0200 (MET DST) Received: from nez-perce.inria.fr (nez-perce.inria.fr [192.93.2.78]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id WAA23801 for ; Wed, 21 Jun 2000 22:00:03 +0200 (MET DST) Received: from mail1.microsoft.com (mail1.microsoft.com [131.107.3.125]) by nez-perce.inria.fr (8.10.0/8.10.0) with SMTP id e5LK02j16515 for ; Wed, 21 Jun 2000 22:00:02 +0200 (MET DST) Received: from 157.54.9.101 by mail1.microsoft.com (InterScan E-Mail VirusWall NT); Wed, 21 Jun 2000 12:59:26 -0700 (Pacific Daylight Time) Received: by INET-IMC-01 with Internet Mail Service (5.5.2651.58) id ; Wed, 21 Jun 2000 12:59:25 -0700 Message-ID: <39ADCF833E74D111A2D700805F1951EF1801470D@RED-MSG-06> From: Don Syme To: "'David.Mentre@irisa.fr'" , caml-list@inria.fr Subject: RE: How to cleanly encode "quasi-constants"? Date: Wed, 21 Jun 2000 12:59:22 -0700 X-Mailer: Internet Mail Service (5.5.2651.58) Sender: weis@pauillac.inria.fr You have spotted a problem with ML-style type systems - they are not great at encoding the kind of "phasing" of initialization that you refer to (neither most are other type systems, though of course one could imagine a type system that allowed you to express this sort of thing). However, the "constants" you refer to can encode quite complex computations (including allocation of data structures, e.g. let x = [2;3;5]]), which is a big advantage compared to, say, C, but it does not cover everything. So in practice people tend to make do with constant values until the initialization sequence gets too complicated, then move to references, but with the knowledge that these references are set once-for-all. Hiding the references behind functions is, as you say, often a good idea. Basically, don't be afraid of using references for this kind of thing - it's one of the reasons they are in the language. Cheers, Don -----Original Message----- From: David.Mentre@irisa.fr [mailto:David.Mentre@irisa.fr] Sent: 20 June 2000 17:00 To: caml-list@inria.fr Subject: How to cleanly encode "quasi-constants"? Hello dear camlists, I'm still learning caml and functionnal programming, so this is maybe a newbie question. Please don't be too rude. In my program, I have variables that can only be modified once (potentially at initialization time after parsing command line and done some computation) and then are never modified for a very long time (rest of program execution). I call them "quasi-constants", they have a write-once semantic. They are used throught the program so it is very painfull to propagate them along function calls (i.e. these variables need a global scope, at least from a programmer point of view). Right now, I'm using constants (let var = ...) or mutable references (let var := ...) to encode such things. However I'm not satisfied. With constants, I obviously can only modify them at compile time. With mutables, I can modify them but potentially at any time, meaning potential bugs. So my question is: What is the Right Way(tm) to encode such a thing in an ML like language and more specifically in OCaml? I was thinking of using a functor (return a module with functions referencing these quasi-constants and quasi-constants values given at module creation). Is it right? It is also possible to use functions, however is seems impracticable for a real program (this approach creates a function many pages long): # let create_manipulator v = let f1 () = v and f2 x = v+x in (f1, f2);; val create_manipulator : int -> (unit -> int) * (int -> int) = # let (g1, g2) = create_manipulator 3;; val g1 : unit -> int = val g2 : int -> int = # g1 ();; - : int = 3 Two side questions: - is there such a problem tackled in a big program ? (ocaml compiler?) - it seems to me that Arg.Set and Arg.Clear types have this semantic (an option is only set at parse time). Best regards, david -- David.Mentre@irisa.fr -- http://www.irisa.fr/prive/dmentre/ Opinions expressed here are only mine.