Mailing list for all users of the OCaml language and system.
 help / color / mirror / Atom feed
* Re: How to cleanly encode "quasi-constants"?
@ 2000-06-28 16:40 Marcin 'Qrczak' Kowalczyk
  2000-06-30  8:04 ` Daniel de Rauglaudre
  0 siblings, 1 reply; 15+ messages in thread
From: Marcin 'Qrczak' Kowalczyk @ 2000-06-28 16:40 UTC (permalink / raw)
  To: caml-list

Tue, 27 Jun 2000 12:12:50 -0700 (PDT), Brian Rogoff <bpr@best.com> pisze:

> I admit I'm also fond of the Revised syntax.

Sorry, I'm new: what is the Revised syntax? Where can I read about it?

-- 
 __("<  Marcin Kowalczyk * qrczak@knm.org.pl http://qrczak.ids.net.pl/
 \__/            GCS/M d- s+:-- a23 C+++$ UL++>++++$ P+++ L++>++++$ E-
  ^^                W++ N+++ o? K? w(---) O? M- V? PS-- PE++ Y? PGP+ t
QRCZAK                5? X- R tv-- b+>++ DI D- G+ e>++++ h! r--%>++ y-



^ permalink raw reply	[flat|nested] 15+ messages in thread
* Re: How to cleanly encode "quasi-constants"?
@ 2000-07-01 19:21 Marcin 'Qrczak' Kowalczyk
  0 siblings, 0 replies; 15+ messages in thread
From: Marcin 'Qrczak' Kowalczyk @ 2000-07-01 19:21 UTC (permalink / raw)
  To: caml-list

01 Jul 2000 20:01:54 +1000, Julian Assange <proff@iq.org> pisze:

> The revised syntax is cleaner, but drops so much syntactic sugar,
> that the language becomes ugly due to its verbosity.

It introduces many []'s. Haskell uses optional layout to avoid that
many brackets and separators. In OCaml it would look similar to this:

value rec iter_row f row = do
    List.iter
       (fun (_, fi) -> match row_field_repr fi with
            Rpresent (Some ty) -> f ty
            Reither _ tl _     -> List.iter f tl
            _                  -> ())
       row.row_fields
    return (match (repr row.row_more).desc with
        Tvariant row -> iter_row f row
        Tvar -> do
            Misc.may (fun (_, l) -> List.iter f l) row.row_name
            return (List.iter f row.row_bound)
        _ -> assert False)

-- 
 __("<  Marcin Kowalczyk * qrczak@knm.org.pl http://qrczak.ids.net.pl/
 \__/            GCS/M d- s+:-- a23 C+++$ UL++>++++$ P+++ L++>++++$ E-
  ^^                W++ N+++ o? K? w(---) O? M- V? PS-- PE++ Y? PGP+ t
QRCZAK                5? X- R tv-- b+>++ DI D- G+ e>++++ h! r--%>++ y-



^ permalink raw reply	[flat|nested] 15+ messages in thread
* RE: How to cleanly encode "quasi-constants"?
@ 2000-06-21 19:59 Don Syme
  0 siblings, 0 replies; 15+ messages in thread
From: Don Syme @ 2000-06-21 19:59 UTC (permalink / raw)
  To: 'David.Mentre@irisa.fr', caml-list

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) = <fun>
# let (g1, g2) = create_manipulator 3;;
val g1 : unit -> int = <fun>
val g2 : int -> int = <fun>
# 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.



^ permalink raw reply	[flat|nested] 15+ messages in thread
* How to cleanly encode "quasi-constants"?
@ 2000-06-20 15:59 David Mentré
  2000-06-22  8:41 ` Christian Rinderknecht
  2000-06-22 20:46 ` Daniel de Rauglaudre
  0 siblings, 2 replies; 15+ messages in thread
From: David Mentré @ 2000-06-20 15:59 UTC (permalink / raw)
  To: caml-list

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) = <fun>
# let (g1, g2) = create_manipulator 3;;
val g1 : unit -> int = <fun>
val g2 : int -> int = <fun>
# 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.



^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2000-07-02 17:14 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2000-06-28 16:40 How to cleanly encode "quasi-constants"? Marcin 'Qrczak' Kowalczyk
2000-06-30  8:04 ` Daniel de Rauglaudre
2000-07-01 10:01   ` Julian Assange
2000-07-01 18:52     ` Brian Rogoff
  -- strict thread matches above, loose matches on Subject: below --
2000-07-01 19:21 Marcin 'Qrczak' Kowalczyk
2000-06-21 19:59 Don Syme
2000-06-20 15:59 David Mentré
2000-06-22  8:41 ` Christian Rinderknecht
2000-06-22 20:46 ` Daniel de Rauglaudre
2000-06-23 14:27   ` Remi VANICAT
2000-06-26 10:19     ` Pierre Weis
2000-06-27  2:26       ` Julian Assange
2000-06-26 10:42     ` Daniel de Rauglaudre
2000-06-27 19:12       ` Brian Rogoff
2000-06-27 19:20         ` Daniel de Rauglaudre

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox