From: Xavier Leroy <Xavier.Leroy@inria.fr>
To: Jerry Jackson <jrj@channelpoint.com>,
"'caml-list@inria.fr'" <caml-list@inria.fr>
Subject: Re: null values and sentinels
Date: Sun, 17 Jan 1999 12:13:25 +0100 [thread overview]
Message-ID: <19990117121325.15238@pauillac.inria.fr> (raw)
In-Reply-To: <8A24EC12044FD21195E200600895E0B34BFBC2@goat.channelpoint.com>; from Jerry Jackson on Tue, Jan 12, 1999 at 08:50:19AM -0700
> I'd like to create a type like:
> # type foo = {xxx: int; mutable yyy: foo};;
> so that I can add nodes by mutating the "yyy" slots. Unfortunately,
> it seems that I must create a sentinel value of type "foo" to stand
> for a null pointer. This works but I'd like to be able to use pattern
> matching on the value of yyy so as to get compile-time warnings if I
> forget to check for null.
>
> So, I tried this:
> # type foo2 = {xxx: int; mutable yyy: bar} and bar = Empty | Pointer of
> foo2;;
> This works (i.e. I can match on yyy in the way that I want), but
> it _seems_ like this will create an extra indirection object in the
> yyy slot. Whether it does or not seems to be a compiler question to
> me... "Pointer of foo2" could be collapsed into foo2 by the
> compiler. Is it? How should I approach this situation?
The representation of Caml datatypes is uniform and always involve an
indirection. So, you'll indeed get an extra indirection with the
"foo2" approach.
You're correct that the compiler could eliminate the indirection in
your example above. The old Caml V3.1 compiler did a lot of
optimizations along these lines, however they don't mix well with the
module system. More recently, Jacques Garrigue and I have been
looking at similar schemes for optimizing the "'a option" type. While
it can be done, the implementation cost is significant, and it messes
up the compiler and the runtime system a little too much to my taste.
My advice would be to go with the clearer solution "foo2", and then
benchmark carefully your program to see if the extra indirection
really hurts performance. (Most often, it does not.) If shaving an
indirection really matters, you'll have to switch to "foo" and
carefully rewrite your pattern-matchings.
- Xavier Leroy
next prev parent reply other threads:[~1999-01-18 11:09 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
1999-01-12 15:50 Jerry Jackson
1999-01-17 11:13 ` Xavier Leroy [this message]
1999-01-18 10:05 ` Anton Moscal
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=19990117121325.15238@pauillac.inria.fr \
--to=xavier.leroy@inria.fr \
--cc=caml-list@inria.fr \
--cc=jrj@channelpoint.com \
/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