From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (from majordomo@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id JAA29355; Sun, 21 Mar 2004 09:40:15 +0100 (MET) X-Authentication-Warning: pauillac.inria.fr: majordomo set sender to owner-caml-list@pauillac.inria.fr using -f Received: from concorde.inria.fr (concorde.inria.fr [192.93.2.39]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id JAA30780 for ; Sun, 21 Mar 2004 09:40:14 +0100 (MET) Received: from swordfish.cs.caltech.edu (swordfish.cs.caltech.edu [131.215.44.124]) by concorde.inria.fr (8.12.10/8.12.10) with ESMTP id i2L8eCHd025446 for ; Sun, 21 Mar 2004 09:40:13 +0100 Received: from orchestra.cs.caltech.edu (orchestra.cs.caltech.edu [131.215.44.20]) by swordfish.cs.caltech.edu (Postfix) with ESMTP id 07588DF2B7; Sun, 21 Mar 2004 00:40:11 -0800 (PST) Received: by orchestra.cs.caltech.edu (Postfix, from userid 2554) id 429279BBA2; Sun, 21 Mar 2004 00:40:08 -0800 (PST) From: Michael Vanier To: oleg_trott@columbia.edu Cc: caml-list@inria.fr In-reply-to: <405D4D77.2030403@columbia.edu> (message from Oleg Trott on Sun, 21 Mar 2004 03:08:23 -0500) Subject: Re: [Caml-list] extensible records again References: <20040321062143.BE7D29BBA2@orchestra.cs.caltech.edu> <405D4D77.2030403@columbia.edu> Message-Id: <20040321084008.429279BBA2@orchestra.cs.caltech.edu> Date: Sun, 21 Mar 2004 00:40:08 -0800 (PST) X-Miltered: at concorde by Joe's j-chkmail ("http://j-chkmail.ensmp.fr")! X-Loop: caml-list@inria.fr X-Spam: no; 0.00; vanier:01 mvanier:01 caml-list:01 extensible:01 2004:99 oleg:01 oleg:01 vanier:01 analogy:01 python:01 guile:01 failwith:01 runtime:01 mli:01 val:01 Sender: owner-caml-list@pauillac.inria.fr Precedence: bulk X-Status: X-Keywords: X-UID: 278 > Date: Sun, 21 Mar 2004 03:08:23 -0500 > From: Oleg Trott > > Michael Vanier wrote: > > >[...] I want users to be able to add > >their own types to the language without hacking the core type definition. > > > > > > Note that in a language like Scheme, users can not add new types other > than by combining the primitives. So, I suppose you aren't really > talking about language users, but those who extend the language. Exactly. The analogy I give is with a language like python, where you can add new types at the C level. Of course, this can be done in e.g. PLT scheme or guile or perl or ruby as well. > > The obvious thing to do is to use polymorphic variants. E.g. > > (* "core language" *) > > let plus a b = > match (a, b) with > | (`Int x), (`Int y) -> `Int (x + y) > (* ... *) > | _ -> failwith "runtime type error: argument is not a number" > > >I can do this as follows: > > > > (* types.mli *) > > type data = > > Int of int > > | Float of float > > | ... > > | Extension of exn > > > > (* files.ml *) > > exception File of out_channel > > > > let close (d : data) = > > match data with > > Extension ext -> > > (match ext with > > File f -> (* close the file *) > > | _ -> raise (Failure "invalid type"))) > > | _ -> raise (Failure "invalid type") > > > >This is OK, but it abuses the exception system. I asked for ways to get the > >same result with polymorphic variants. A suggested approach (thanks to > >Aleksey Nogin) was this: > > > ># type 'a data = Int of int | Ext of 'a;; > >type 'a data = Int of int | Ext of 'a > ># let open_file f = > > match f with > > Ext `File f -> print_string ("Opening file" ^ f) > > | _ -> raise (Invalid_argument "open_file") > > ;; > >val open_file : [> `File of string] data -> unit = > ># let run ( f : [> ] data -> unit) = f (Ext (`Foo 1));; > >val run : ([> `Foo of int] data -> unit) -> unit = > ># run open_file;; > >Exception: Invalid_argument "open_file" > > > > > > > (* language exension example, adding "files" *) > > let open = function `File f -> open_file f | _ -> failwith "runtime type > error: argument is not a file" > > > HTH > Oleg > I don't know if I can do this. I have a top-level "data" type which all data objects must be instances of. So in the case above, "open" would be a function which took an argument of type "data". The question is then: how do I specify the "data" type without explicitly making it polymorphic? Mike ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners