ANN: prettyprinting, typesafe marshalling, dynamic typing for free.
[
Home
]
[ Index:
by date

by threads
]
[ Message by date: previous  next ] [ Message in thread: previous  next ] [ Thread: previous  next ]
[ Message by date: previous  next ] [ Message in thread: previous  next ] [ Thread: previous  next ]
Date:   (:) 
From:  Jeremy Yallop <jeremy.yallop@e...> 
Subject:  ANN: prettyprinting, typesafe marshalling, dynamic typing for free. 
I'm pleased to announce an initial release of `deriving', a system for constructing functions automatically from type definitions. Deriving extends OCaml with two new operations: a syntax for calling an "overloaded" function at a particular type: C.function<t> v and the `deriving' construct found in Haskell (and Clean) for requesting that the implementation generate an instance of an overloaded function from a type definition: type t = r deriving (C1, C2) Deriving provides functions for prettyprinting, dynamic typing, typesafe structuresharing marshalling, SMLstyle equality, mapping, and more. Functions can be generated for most OCaml types, including records, standard and polymorphic variants, tuples, mutually recursive types, and types that use abstract type constructors defined elsewhere. A few more exotic constructs, such as private types and type replication, are supported. Derived functions are also extensible: the user can choose to supply an implementation at a particular type if the generated version is not to his taste. You can find deriving (along with preliminary documentation and tests) at http://code.google.com/p/deriving/ Note: you'll need OCaml 3.10. Some examples of use follow. Prettyprinting: Show.show<int> 3 => "3" let factors = [(10,[2;5]); (11, []); 12, [2;3;4;6]] Show.show<(int * int list) list> factors => "[(10,[2; 5]); (11, []); 12, [2; 3; 4; 6]]" type 'a tree = Leaf of 'a  Branch of 'a tree * 'a * 'a tree deriving (Show, Typeable, Eq, Shelve) type point = { x : float; y : float } deriving (Show, Typeable, Eq, Shelve) let points = Branch (Leaf {x=0.0; y=0.0;}, {x=2.0; y=2.0}, Branch (Leaf {x=1.0; y=1.0}, {x=1.0; y=0.0}, Leaf {x=0.0; y=1.0})) Show.show<point tree> points => "Branch (Leaf {x =193.11; y =132.13}, {x =211.91; y =201.11}, Branch (Leaf {x =113.12; y =1.}, {x =12.7; y =44.1}, Leaf {x =0.; y =13.41}))" Dynamic typing: let items = [Typeable.mk<int> 3; Typeable.mk<float> 3.0; Typeable.mk<string tree> (Leaf "three")] => [<abstr>; <abstr>; <abstr>] Typeable.cast<int> (List.hd items) => Some 3 Typeable.cast<float> (List.hd items) => None Dynamic typing again: type 'a seq = [`Nil  `Cons of 'a * 'a seq] deriving (Typeable) let l = `Cons (3, `Cons (2, `Cons (1, `Nil))) Typeable.cast<[`Cons of int * 'a`Nil] as 'a> (Typeable.mk<int seq> l) => Some (`Cons (3, `Cons (2, `Cons (1, `Nil)))) Serialisation (marshalling): Shelve.shelveS<point tree> points => "\007\003\t\128\128\128\128\128\128\128\248?\t\128\128\128\128\128\128\128\128@\001\000\005\000\001\008\000\001\n\001\003\004\t\003\000\001\012\001\003\006\011\005\005\002\002\000\002\000\002\002\000\000\002\001\001\002\002\002" Shelve.unshelveS<point tree> (Shelve.shelveS<point tree> points) => Branch (Leaf {x =193.11; y =132.13}, {x =211.91; y =201.11}, Branch (Leaf {x =113.12; y =1.}, {x =12.7; y =44.1}, Leaf {x =0.; y =13.41})) Shelve.unshelveS<int> (Shelve.shelveS<point tree> points) => *** Exception For more see the documentation and test suite. Comments, bug reports, and other feedback will be most welcome. Jeremy.