From: Hal Daume III <hdaume@ISI.EDU>
To: Caml Mailing List <caml-list@yquem.inria.fr>
Subject: Re: [Caml-list] generic data type -> int function
Date: Tue, 29 Mar 2005 19:26:02 -0800 (PST) [thread overview]
Message-ID: <Pine.LNX.4.44.0503291923480.26490-100000@albini.isi.edu> (raw)
In-Reply-To: <16963.63456.885441.571929@gargle.gargle.HOWL>
Unsatisfied with any of the solutions offered to me, I threw together a
quick perl script to do this for me. For anyone who wants it, you can get
it at:
http://www.isi.edu/~hdaume/type_to_enum.pl
It's very limited in that it has no knowledge of built in types, and type
specs must all be on one line per type, but for my purposes it works
keenly.
Example input:
type etype = GPE | LOC | ORG | PER | NAE_e | BOS_e
type mtype = BAR | NAM | NOM | PRE | PRO | OTHER | NAE_m | BOS_m
type pairs = EM of etype*mtype | EE of etype*etype | MM of mtype*mtype
type pairs2 = EP of etype * pairs | MP of mtype * pairs
Corresponding output:
let int_of_etype = function | GPE -> 0 | LOC -> 1 | ORG -> 2 | PER -> 3 | NAE_e -> 4 | BOS_e -> 5
let int_of_mtype = function | BAR -> 0 | NAM -> 1 | NOM -> 2 | PRE -> 3 | PRO -> 4 | OTHER -> 5 | NAE_m -> 6 | BOS_m -> 7
let int_of_pairs = function | EM (etype_0, mtype_1) -> 0 + 1 * (int_of_etype etype_0 + 6 * (int_of_mtype mtype_1)) | EE (etype_0, etype_1) -> 48 + 1 * (int_of_etype etype_0 + 6 * (int_of_etype etype_1)) | MM (mtype_0, mtype_1) -> 84 + 1 * (int_of_mtype mtype_0 + 8 * (int_of_mtype mtype_1))
let int_of_pairs2 = function | EP (etype_0, pairs_1) -> 0 + 1 * (int_of_etype etype_0 + 6 * (int_of_pairs pairs_1)) | MP (mtype_0, pairs_1) -> 888 + 1 * (int_of_mtype mtype_0 + 8 * (int_of_pairs pairs_1))
I've stress tested it a bit and it seems to be all in working order.
On Fri, 25 Mar 2005, Jean-Christophe Filliatre wrote:
>
> Hi,
>
> > Is there a straightforward way (or a built in function, or...) to
> > automatically map an enumerated data type to integers (and back, if
> > possible, but that's not strictly necessary).
>
> I don't think there such a built-in function. But using Obj.magic to
> convert constant constructors to integers is safe (the constant
> constructors of a type are represented by integers starting from 0):
>
> ======================================================================
> # type t = A|B|C|D;;
> type t = A | B | C | D
> # (Obj.magic A : int);;
> - : int = 0
> # (Obj.magic D : int);;
> - : int = 3
> ======================================================================
>
> Going the way back obviously requires a dynamic check (the integer
> needs to be within the right bounds).
>
> Note that I do not encourage the use of Obj.magic. I even think that
> writing your own function to convert constructors to integers will be
> equally fast (since pattern-matching is compiled using a constant time
> lookup table in this case); and you can macro-generate such functions.
>
> Hope this helps,
>
--
Hal Daume III | hdaume@isi.edu
"Arrest this man, he talks in maths." | www.isi.edu/~hdaume
next prev parent reply other threads:[~2005-03-30 4:03 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-03-24 16:38 Hal Daume III
2005-03-25 11:37 ` [Caml-list] " Jean-Christophe Filliatre
2005-03-30 3:26 ` Hal Daume III [this message]
2005-03-30 22:27 ` Oliver Bandel
2005-03-31 14:33 ` Hal Daume III
2005-03-31 17:01 ` Richard Jones
2005-03-31 18:04 ` Hal Daume III
2005-03-30 22:29 ` Oliver Bandel
2005-03-31 14:33 ` Hal Daume III
2005-03-25 19:15 ` Kim Nguyen
2005-03-29 7:29 ` Oliver Bandel
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=Pine.LNX.4.44.0503291923480.26490-100000@albini.isi.edu \
--to=hdaume@isi.edu \
--cc=caml-list@yquem.inria.fr \
/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