Browse thread
[Caml-list] revised syntax and immediate objects
[
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: | 2006-07-04 (22:52) |
From: | Matt Gushee <matt@g...> |
Subject: | Re: [Caml-list] revised syntax and immediate objects |
Jonathan Roewen wrote: > What is the syntax for immediate objects in ocaml when using revised syntax? Not sure offhand, but ... > I'd like to try make a camlp4 syntax extension that uses immediate > objects, I've done that. I'll show you the key section of the code below, and I can send you the complete file if you like. It may not be 100% correct, but I've been using it in an application and so far it works. I don't know if I can *explain* it, though ... I wrote it several months ago, and I'm coming to think that CamlP4, like Perl, is a write-only language ;-) [BTW, *_si in function names means "structure item", and *_csi means "class structure item"] let object_body loc decls = let sub_objects = let sos = List.fold_right ( fun idat lst -> match idat.sub_obj with | None -> lst | Some so -> so::lst ) decls [] in <:class_str_item< declare $list:sos$ end >> and accessors = let accs = List.fold_right ( fun idat lst -> match idat.setter with | None -> idat.getter :: lst | Some se -> idat.getter :: se :: lst ) decls [] in <:class_str_item< declare $list:accs$ end >> in (sub_objects, accessors) let subconf_csi loc key decls = let sub_objects, accessors = object_body loc decls and pself = <:patt< self >> and inheritance = <:class_str_item< inherit sub_config data defaults path as super >> in let obj_expr = MLast.ExObj (loc, Some pself, [inheritance; sub_objects; accessors]) in let keylist_expr = <:expr< [$str:key$] >> in let path_bind_expr = <:expr< let path = path @ $keylist_expr$ in $obj_expr$ >> and oname = key ^ "_" in Some <:class_str_item< value $lid:oname$ = $path_bind_expr$ >> let rootconf_si loc cname decls = let sub_objects, accessors = object_body loc decls and pself = <:patt< self >> and inheritance = <:class_str_item< inherit root_config srcs dest data defaults as super >> in let oe = MLast.ExObj (loc, Some pself, [inheritance; sub_objects; accessors]) in <:str_item< value $lid:cname$ srcs dest = let data = Dict.create () and path = [] in $oe$ >> let main_si loc cname decls = write_example decls; let os = <:str_item< open Rascl >> and oc = <:str_item< open ConfigObject >> and od = <:str_item< open Dict >> and defcreate = <:str_item< value defaults = create () >> and defsetup0 = top_doin_expr loc [] decls in let defsetup = <:str_item< $exp:defsetup0$ >> and cl = rootconf_si loc cname decls in let all = [os; oc; od; defcreate; defsetup; cl] in <:str_item< declare $list:all$ end >> -- Matt Gushee : Bantam - lightweight file manager : matt.gushee.net/software/bantam/ : : RASCL's A Simple Configuration Language : matt.gushee.net/rascl/ :