Re: Constructor/reference bug?

From: Markus Mottl (mottl@miss.wu-wien.ac.at)
Date: Thu Aug 12 1999 - 14:16:03 MET DST


From: Markus Mottl <mottl@miss.wu-wien.ac.at>
Message-Id: <199908121116.NAA02423@miss.wu-wien.ac.at>
Subject: Re: Constructor/reference bug?
To: skaller@maxtal.com.au (John Skaller)
Date: Thu, 12 Aug 1999 13:16:03 +0100 (MET DST)
In-Reply-To: <3.0.6.32.19990811180530.00985e40@mail.triode.net.au> from "John Skaller" at Aug 11, 99 06:05:30 pm

> let g x =
> let lineno = ref (1,"") in
> let rec f x' = match x' with
> | NEWLINE p :: t -> lineno := p; f t
> | COLON :: t -> CTRL !lineno :: f t
> | h :: t -> h :: f t
> | [] -> []
> in f x;;
>
> The code doesn't work as I expected: every
> CTRL value refers to the same lineno, the last one.
> If I change the COLON line to read:
>
> | COLON :: t -> let x = !lineno in CTRL x :: f t
>
> the code works as expected -- the CTRL refers to the
> value of lineno at the time the last NEWLINE was processed.
>
> What's happening? Are coproduct constructors lazy?

No, but OCaml evaluates all kind of expressions right-to-left which is
probably not very intuitive for people who are used to read from left
to right...

Regards,
Markus Mottl

-- 
Markus Mottl, mottl@miss.wu-wien.ac.at, http://miss.wu-wien.ac.at/~mottl



This archive was generated by hypermail 2b29 : Sun Jan 02 2000 - 11:58:24 MET