Skip to content

Commit 338db60

Browse files
committed
a way to get poly opaque data and algebraic data
1 parent c1b497c commit 338db60

File tree

8 files changed

+132
-2278
lines changed

8 files changed

+132
-2278
lines changed

src/.ppcache/API.ml

Lines changed: 0 additions & 1430 deletions
This file was deleted.

src/.ppcache/API.mli

Lines changed: 0 additions & 724 deletions
This file was deleted.

src/.ppcache/data.ml

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
(*d1ab878a9994ecb249bc95701570d498a788a5b4 *src/data.ml *)
1+
(*7f2ba7fa31dccc0775a96d5831ee46cdbb09241c *src/data.ml *)
22
#1 "src/data.ml"
33
module Fmt = Format
44
module F = Ast.Func
@@ -1669,8 +1669,10 @@ module BuiltInPredicate =
16691669
| S: ('bs, 'b, 'ms, 'm, 'self, 'ctx) constructor_arguments ->
16701670
('self -> 'bs, 'self -> 'b, 'self -> 'ms, 'self -> 'm, 'self,
16711671
'ctx) constructor_arguments
1672-
| C: (('self, 'ctx) Conversion.t -> ('a, 'ctx) Conversion.t) *
1673-
('bs, 'b, 'ms, 'm, 'self, 'ctx) constructor_arguments ->
1672+
| C:
1673+
(('self, Conversion.ctx) Conversion.t ->
1674+
('a, Conversion.ctx) Conversion.t)
1675+
* ('bs, 'b, 'ms, 'm, 'self, 'ctx) constructor_arguments ->
16741676
('a -> 'bs, 'a -> 'b, 'a -> 'ms, 'a -> 'm, 'self, 'ctx)
16751677
constructor_arguments
16761678
type ('t, 'h) constructor =
@@ -1704,16 +1706,17 @@ module BuiltInPredicate =
17041706
('t, 'h) compiled_constructor Constants.Map.t
17051707
let buildk ~mkConst kname =
17061708
function | [] -> mkConst kname | x::xs -> mkApp kname x xs
1707-
let rec readback_args : type a m t h.
1709+
let rec readback_args : type a m t.
17081710
look:(depth:int -> term -> term) ->
17091711
Conversion.ty_ast ->
17101712
depth:int ->
1711-
h ->
1713+
#Conversion.ctx ->
17121714
constraints ->
17131715
State.t ->
17141716
extra_goals list ->
17151717
term ->
1716-
(a, m, t, h) compiled_constructor_arguments ->
1718+
(a, m, t, Conversion.ctx)
1719+
compiled_constructor_arguments ->
17171720
a -> term list -> (State.t * t * extra_goals)
17181721
=
17191722
fun ~look ->
@@ -1743,15 +1746,15 @@ module BuiltInPredicate =
17431746
readback_args ~look ty ~depth hyps
17441747
constraints state (gls :: extra) origin
17451748
rest (convert x) xs
1746-
and readback : type t h.
1749+
and readback : type t.
17471750
mkinterval:(int -> int -> int -> term list) ->
17481751
look:(depth:int -> term -> term) ->
17491752
alloc:(?name:string -> State.t -> (State.t * 'uk)) ->
17501753
mkUnifVar:('uk -> args:term list -> State.t -> term) ->
17511754
Conversion.ty_ast ->
1752-
(t, h) compiled_adt ->
1755+
(t, Conversion.ctx) compiled_adt ->
17531756
depth:int ->
1754-
h ->
1757+
#Conversion.ctx ->
17551758
constraints ->
17561759
State.t -> term -> (State.t * t * extra_goals)
17571760
=
@@ -1801,15 +1804,16 @@ module BuiltInPredicate =
18011804
with
18021805
| Not_found ->
18031806
raise (Conversion.TypeErr (ty, depth, t))
1804-
and adt_embed_args : type m a t h.
1807+
and adt_embed_args : type m a t.
18051808
mkConst:(int -> term) ->
18061809
Conversion.ty_ast ->
1807-
(t, h) compiled_adt ->
1810+
(t, Conversion.ctx) compiled_adt ->
18081811
constant ->
18091812
depth:int ->
1810-
h ->
1813+
#Conversion.ctx ->
18111814
constraints ->
1812-
(a, m, t, h) compiled_constructor_arguments ->
1815+
(a, m, t, Conversion.ctx)
1816+
compiled_constructor_arguments ->
18131817
(State.t -> (State.t * term * extra_goals)) list ->
18141818
m
18151819
=
@@ -1841,13 +1845,13 @@ module BuiltInPredicate =
18411845
((fun state ->
18421846
d.embed ~depth hyps constraints
18431847
state x) :: acc))
1844-
and embed : type a h.
1848+
and embed : type a.
18451849
mkConst:(int -> term) ->
18461850
Conversion.ty_ast ->
18471851
(Format.formatter -> a -> unit) ->
1848-
(a, h) compiled_adt ->
1852+
(a, Conversion.ctx) compiled_adt ->
18491853
depth:int ->
1850-
h ->
1854+
#Conversion.ctx ->
18511855
constraints ->
18521856
State.t -> a -> (State.t * term * extra_goals)
18531857
=
@@ -1875,9 +1879,9 @@ module BuiltInPredicate =
18751879
matcher ~ok ~ko:(aux rest) t state in
18761880
aux bindings state
18771881
let rec compile_arguments : type b bs m ms t.
1878-
(bs, b, ms, m, t, 'h) constructor_arguments ->
1879-
(t, #Conversion.ctx as 'h) Conversion.t ->
1880-
(bs, ms, t, 'h) compiled_constructor_arguments
1882+
(bs, b, ms, m, t, Conversion.ctx) constructor_arguments ->
1883+
(t, #Conversion.ctx) Conversion.t ->
1884+
(bs, ms, t, Conversion.ctx) compiled_constructor_arguments
18811885
=
18821886
fun arg ->
18831887
fun self ->

src/API.ml

Lines changed: 52 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -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

286282
end
287283

@@ -618,53 +614,47 @@ end
618614

619615
module 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

src/API.mli

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -327,14 +327,26 @@ module OpaqueData : sig
327327

328328
type 'a cdata_with_constants
329329

330-
val declare : 'a declaration -> 'a cdata_with_constants
331-
val build_conversion : 'a cdata_with_constants -> ('a,'c) Conversion.t
330+
val declare : 'a declaration ->
331+
Conversion.ty_ast * (Format.formatter -> 'a -> unit) * (Format.formatter -> unit -> unit) * 'a cdata_with_constants
332332

333-
(* To circumvent value restriction you have assemble a Conversion.t by hand *)
333+
(** To circumvent value restriction you have assemble a Conversion.t by
334+
hand. Example (top level of a module):
335+
336+
let ty, pp, pp_doc, name = declare {
337+
name = "name";
338+
cname = "Names.Name.t";
339+
doc = "Name hints";
340+
pp = ...
341+
}
342+
let name : 'c. (Names.Name.t, #ctx as 'c) t= { ty; pp; pp_doc;
343+
embed = (fun ~depth -> embed name ~depth);
344+
readback = (fun ~depth -> readback name ~depth);
345+
}
346+
347+
*)
334348
val embed : 'a cdata_with_constants -> ('a,'c) Conversion.embedding
335349
val readback : 'a cdata_with_constants -> ('a,'c) Conversion.readback
336-
val rest : 'a cdata_with_constants ->
337-
Conversion.ty_ast * (Format.formatter -> 'a -> unit) * (Format.formatter -> unit -> unit)
338350

339351
end
340352

@@ -403,7 +415,7 @@ module AlgebraicData : sig
403415
| S : ('bs,'b, 'ms, 'm, 'self, 'c) constructor_arguments -> ('self -> 'bs, 'self -> 'b, 'self -> 'ms, 'self -> 'm, 'self, 'c) constructor_arguments
404416
(* An argument of type `T 'self` for a constainer `T`, like a `list 'self`.
405417
`S args` above is a shortcut for `C(fun x -> x, args)` *)
406-
| C : (('self,'c) Conversion.t -> ('a,'c) Conversion.t) * ('bs,'b,'ms,'m,'self, 'c) constructor_arguments -> ('a -> 'bs, 'a -> 'b, 'a -> 'ms,'a -> 'm, 'self, 'c) constructor_arguments
418+
| C : (('self,Conversion.ctx) Conversion.t -> ('a,Conversion.ctx) Conversion.t) * ('bs,'b,'ms,'m,'self, 'c) constructor_arguments -> ('a -> 'bs, 'a -> 'b, 'a -> 'ms,'a -> 'm, 'self, 'c) constructor_arguments
407419

408420
type ('t,'c) constructor =
409421
K : name * doc *
@@ -420,7 +432,17 @@ module AlgebraicData : sig
420432
}
421433
constraint 'c = #Conversion.ctx
422434

423-
val declare : ('t,'c) declaration -> ('t,'c) Conversion.t
435+
(** In order to obtain a quantification over the context one can do
436+
as follows:
437+
438+
let { ty; pp; pp_doc; embed; readback } = declare { ... }
439+
let foo : 'c. (foo, #ctx as 'c) t = { ty; pp; pp_doc;
440+
embed = (fun ~depth (c : #ctx) -> embed ~depth (c :> ctx));
441+
readback = (fun ~depth (c : #ctx) -> readback ~depth (c :> ctx));
442+
}
443+
444+
*)
445+
val declare : ('t,Conversion.ctx) declaration -> ('t,Conversion.ctx) Conversion.t
424446

425447
end
426448

@@ -795,8 +817,8 @@ module BuiltInData : sig
795817
val string : (string, 'c) Conversion.t
796818
val list : ('a, 'c) Conversion.t -> ('a list, 'c) Conversion.t
797819
val loc : (Ast.Loc.t, 'c) Conversion.t
798-
val bool : (bool, 'c) Conversion.t
799-
val char : (char, 'c) Conversion.t
820+
val bool : (bool, 'c) Conversion.t
821+
val char : (char, 'c) Conversion.t
800822
(* The string is the "file name" *)
801823
val in_stream : (in_channel * string, 'c) Conversion.t
802824
val out_stream : (out_channel * string, 'c) Conversion.t

src/builtin.ml

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -919,7 +919,7 @@ let ctype = AlgebraicData.declare {
919919
]
920920
}
921921

922-
let safe_wc = OpaqueData.declare {
922+
let ty, pp, pp_doc, safe = OpaqueData.declare {
923923
OpaqueData.name = "safe";
924924
cname = "safe";
925925
pp = (fun fmt (id,l) ->
@@ -931,12 +931,9 @@ let safe_wc = OpaqueData.declare {
931931
doc = "Holds data across bracktracking; can only contain closed terms";
932932
constants = [];
933933
}
934-
let ty, pp, pp_doc = OpaqueData.rest safe_wc
935-
let safe : 'c. ('a, #Conversion.ctx as 'c) Conversion.t =
936-
{
937-
Conversion.ty; pp; pp_doc;
938-
embed = (fun ~depth -> OpaqueData.embed safe_wc ~depth);
939-
readback = (fun ~depth -> OpaqueData.readback safe_wc ~depth);
934+
let safe : 'c. ('a, #Conversion.ctx as 'c) Conversion.t = { Conversion.ty; pp; pp_doc;
935+
embed = (fun ~depth -> OpaqueData.embed safe ~depth);
936+
readback = (fun ~depth -> OpaqueData.readback safe ~depth);
940937
}
941938

942939
let safeno = ref 0
@@ -1169,7 +1166,7 @@ let elpi_stdlib_src = let open BuiltIn in let open BuiltInData in [
11691166
let ocaml_set ~name (type a)
11701167
(alpha : (a,Conversion.ctx) Conversion.t) (module Set : Util.Set.S with type elt = a) =
11711168

1172-
let set_wc = OpaqueData.declare {
1169+
let ty, pp, pp_doc, set = OpaqueData.declare {
11731170
OpaqueData.name;
11741171
cname = name;
11751172
doc = "";
@@ -1179,11 +1176,9 @@ let set_wc = OpaqueData.declare {
11791176
hconsed = false;
11801177
constants = [];
11811178
} in
1182-
let ty, pp, pp_doc = OpaqueData.rest set_wc in
1183-
let set : (Set.t, #Conversion.ctx as 'c) Conversion.t = {
1184-
Conversion.ty; pp; pp_doc;
1185-
embed = (fun ~depth -> OpaqueData.embed set_wc ~depth);
1186-
readback = (fun ~depth -> OpaqueData.readback set_wc ~depth);
1179+
let set : (Set.t, #Conversion.ctx as 'c) Conversion.t = { Conversion.ty; pp; pp_doc;
1180+
embed = (fun ~depth -> OpaqueData.embed set ~depth);
1181+
readback = (fun ~depth -> OpaqueData.readback set ~depth);
11871182
} in
11881183

11891184
let open BuiltIn in let open BuiltInData in let open Conversion in
@@ -1280,7 +1275,7 @@ let ocaml_map ~name (type a)
12801275

12811276
let closed_A = BuiltInData.closed "A" in
12821277

1283-
let map_wc = OpaqueData.declare {
1278+
let ty, pp, pp_doc, map = OpaqueData.declare {
12841279
OpaqueData.name;
12851280
cname = name;
12861281
doc = "";
@@ -1290,12 +1285,11 @@ let map_wc = OpaqueData.declare {
12901285
hconsed = false;
12911286
constants = [];
12921287
} in
1293-
let ty, pp, pp_doc = OpaqueData.rest map_wc in
12941288
let map a = {
12951289
Conversion.ty = Conversion.(TyApp(name,TyName a,[]));
12961290
pp; pp_doc;
1297-
embed = (fun ~depth -> OpaqueData.embed map_wc ~depth);
1298-
readback = (fun ~depth -> OpaqueData.readback map_wc ~depth);
1291+
embed = (fun ~depth -> OpaqueData.embed map ~depth);
1292+
readback = (fun ~depth -> OpaqueData.readback map ~depth);
12991293
} in
13001294

13011295
let open BuiltIn in let open BuiltInData in let open Conversion in

0 commit comments

Comments
 (0)