@@ -260,28 +260,24 @@ module OpaqueData = struct
260260 with Not_found -> raise (Conversion. TypeErr (Conversion. TyName name,depth,t)) end
261261 | t -> raise (Conversion. TypeErr (Conversion. TyName name,depth,t))
262262
263+ let declare_cdata cdata name doc constants =
264+ let cd_w_consts =
265+ cdata, name,
266+ List. fold_right (fun (n ,v ) ->
267+ ED.Constants.Map. add (ED.Global_symbols. declare_global_symbol n) (n,v))
268+ constants ED.Constants.Map. empty, doc in
269+ let ty, pp, pp_doc = rest cd_w_consts in
270+ ty, pp, pp_doc, cd_w_consts
271+
263272 let declare { name; cname; doc; pp; compare; hash; hconsed; constants; } =
264- let cdata = declare {
273+ let c = declare {
265274 data_compare = compare;
266275 data_pp = pp;
267276 data_hash = hash;
268277 data_name = cname;
269278 data_hconsed = hconsed;
270- } in
271- cdata, name,
272- List. fold_right (fun (n ,v ) ->
273- ED.Constants.Map. add (ED.Global_symbols. declare_global_symbol n) (n,v))
274- constants ED.Constants.Map. empty, doc
275-
276- let build_conversion x =
277- let ty, pp, pp_doc = rest x in
278- {
279- Conversion. ty;
280- pp;
281- pp_doc;
282- embed = embed x;
283- readback = readback x;
284- }
279+ } in
280+ declare_cdata c name doc constants
285281
286282end
287283
@@ -618,53 +614,47 @@ end
618614
619615module BuiltInData = struct
620616
621- let [@ elpi.template] inline_data = fun name doc cdata constants constants_map ->
622- let { Util.CData. cin; isc; cout; name= c } = cdata in
623- let ty = Conversion. TyName name in
624- let embed ~depth :_ _ _ state x =
625- state, ED.Term. CData (cin x), [] in
626- let readback ~depth _ _ state t =
627- let module R = (val ! r) in let open R in
628- match R. deref_head ~depth t with
629- | ED.Term. CData c when isc c -> state, cout c, []
630- | ED.Term. Const i as t when i < 0 ->
631- begin try state, ED.Constants.Map. find i constants_map, []
632- with Not_found -> raise (Conversion. TypeErr (ty,depth,t)) end
633- | t -> raise (Conversion. TypeErr (ty,depth,t)) in
634- let pp_doc fmt () =
635- let module R = (val ! r) in let open R in
636- if doc <> " " then begin
637- ED.BuiltInPredicate. pp_comment fmt (" % " ^ doc);
638- Format. fprintf fmt " @\n " ;
639- end ;
640- Format. fprintf fmt " @[<hov 2>typeabbrev %s (ctype \" %s\" ).@]@\n @\n " name c;
641- List. iter (fun (c ,_ ) ->
642- Format. fprintf fmt " @[<hov 2>type %s %s.@]@\n " c name)
643- constants in
644- { Conversion. embed; readback; ty; pp_doc; pp = (fun fmt x -> Util.CData. pp fmt (cin x)) }
645-
646- let int : 'h. (int, 'h) Conversion.t = [% elpi.template inline_data " int" " " ED.C. int [] ED.Constants.Map. empty]
647- let float : 'h. (float, 'h) Conversion.t = [% elpi.template inline_data " float" " " ED.C. float [] ED.Constants.Map. empty]
648- let string : 'h. (string, 'h) Conversion.t = [% elpi.template inline_data " string" " " ED.C. string [] ED.Constants.Map. empty]
649- let loc : 'h. (Util.Loc.t, 'h) Conversion.t = [% elpi.template inline_data " loc" " " ED.C. loc [] ED.Constants.Map. empty]
650- let char : 'h. (char, 'h) Conversion.t = [% elpi.template inline_data " char" " an octect" RawOpaqueData. char [] ED.Constants.Map. empty]
651-
652- let in_stream_constants = [" std_in" ,(stdin," stdin" )]
653- let in_stream_cmap = List. fold_left (fun m (c ,v ) ->
654- let c = ED.Global_symbols. declare_global_symbol c in
655- ED.Constants.Map. add c v m)
656- ED.Constants.Map. empty in_stream_constants
657-
658- let in_stream : 'h. (in_channel * string, 'h) Conversion.t = [% elpi.template inline_data " in_stream" " " RawOpaqueData. in_stream in_stream_constants in_stream_cmap]
659-
660- let out_stream_constants = [" std_out" ,(stdout," stdout" );" std_err" ,(stderr," stderr" )]
661- let out_stream_cmap = List. fold_left (fun m (c ,v ) ->
662- let c = ED.Global_symbols. declare_global_symbol c in
663- ED.Constants.Map. add c v m)
664- ED.Constants.Map. empty out_stream_constants
665-
666- let out_stream : 'h. (out_channel * string, 'h) Conversion.t = [% elpi.template inline_data " out_stream" " " RawOpaqueData. out_stream out_stream_constants out_stream_cmap]
617+ let ty, pp, pp_doc, int = OpaqueData. declare_cdata RawOpaqueData. int " int" " " []
618+ let int : 'h. (int, 'h) Conversion.t = { Conversion. ty; pp; pp_doc;
619+ embed = (fun ~depth -> OpaqueData. embed int ~depth );
620+ readback = (fun ~depth -> OpaqueData. readback int ~depth );
621+ }
667622
623+ let ty, pp, pp_doc, float = OpaqueData. declare_cdata RawOpaqueData. float " float" " " []
624+ let float : 'h. (float, 'h) Conversion.t = { Conversion. ty; pp; pp_doc;
625+ embed = (fun ~depth -> OpaqueData. embed float ~depth );
626+ readback = (fun ~depth -> OpaqueData. readback float ~depth );
627+ }
628+
629+ let ty, pp, pp_doc, string = OpaqueData. declare_cdata RawOpaqueData. string " string" " " []
630+ let string : 'h. (string, 'h) Conversion.t = { Conversion. ty; pp; pp_doc;
631+ embed = (fun ~depth -> OpaqueData. embed string ~depth );
632+ readback = (fun ~depth -> OpaqueData. readback string ~depth );
633+ }
634+
635+ let ty, pp, pp_doc, loc = OpaqueData. declare_cdata RawOpaqueData. loc " loc" " " []
636+ let loc : 'h. (Util.Loc.t, 'h) Conversion.t = { Conversion. ty; pp; pp_doc;
637+ embed = (fun ~depth -> OpaqueData. embed loc ~depth );
638+ readback = (fun ~depth -> OpaqueData. readback loc ~depth );
639+ }
640+
641+ let ty, pp, pp_doc, char = OpaqueData. declare_cdata RawOpaqueData. char " char" " an octect" []
642+ let char : 'h. (char, 'h) Conversion.t = { Conversion. ty; pp; pp_doc;
643+ embed = (fun ~depth -> OpaqueData. embed char ~depth );
644+ readback = (fun ~depth -> OpaqueData. readback char ~depth );
645+ }
646+
647+ let ty, pp, pp_doc, in_stream = OpaqueData. declare_cdata RawOpaqueData. in_stream " in_stream" " " [" std_in" ,(stdin," stdin" )]
648+ let in_stream : 'h. (in_channel * string, 'h) Conversion.t = { Conversion. ty; pp; pp_doc;
649+ embed = (fun ~depth -> OpaqueData. embed in_stream ~depth );
650+ readback = (fun ~depth -> OpaqueData. readback in_stream ~depth );
651+ }
652+
653+ let ty, pp, pp_doc, out_stream = OpaqueData. declare_cdata RawOpaqueData. out_stream " out_stream" " " [" std_out" ,(stdout," stdout" );" std_err" ,(stderr," stderr" )]
654+ let out_stream : 'h. (out_channel * string, 'h) Conversion.t = { Conversion. ty; pp; pp_doc;
655+ embed = (fun ~depth -> OpaqueData. embed out_stream ~depth );
656+ readback = (fun ~depth -> OpaqueData. readback out_stream ~depth );
657+ }
668658
669659 let poly ty =
670660 let embed ~depth :_ _ _ state x = state, x, [] in
0 commit comments