package GT
Generic programming with extensible transformations
Install
Dune Dependency
Authors
Maintainers
Sources
0.5.2.tar.gz
md5=9d18b96ada4d18fdda0b5f5698273145
sha512=945070bea4322bf8f7932a259af91432a3c109a05294ba2a27c1c2e9d2796ffb4cc32f6b8e28ff465311277696296ddda531a2ce818e590c09c64c5721d65e19
doc/src/gfmt/gfmt.ml.html
Source file gfmt.ml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
(* * Generic Transformers: `format` plugin. * Copyright (C) 2016-2022 * Dmitrii Kosarev a.k.a Kakadu * St.Petersburg State University, JetBrains Research *) (** {i Format} module: pretty-prints a value to {!Format.formatter} using {!Format} module. For type declaration [type ('a,'b,...) typ = ...] it will create a transformation function with type [(Format.formatter -> 'a -> unit) -> (Format.formatter -> 'b -> unit) -> ... -> Format.formatter -> ('a,'b,...) typ -> unit ] Inherited attributes' type (both default and for type parameters) is [Format.formatter]. Synthesized attributes' type (both default and for type parameters) is [unit]. *) open Ppxlib open Stdppx open Printf open GTCommon open HelpersBase let trait_name = "fmt" module Make (AstHelpers : GTHELPERS_sig.S) = struct let trait_name = trait_name module P = Plugin.Make (AstHelpers) open AstHelpers let app_format_fprintf ~loc efmtr efmts = Exp.app_list ~loc Exp.(of_longident ~loc (Ldot (Lident "Format", "fprintf"))) [ efmtr; efmts ] ;; class g args tdecls = object (self) inherit [loc, Exp.t, Typ.t, type_arg, Cl.t, Ctf.t, Cf.t, Str.t, Sig.t, Pat.t] Plugin_intf .typ_g inherit P.generator args tdecls inherit P.with_inherited_attr args tdecls method trait_name = trait_name method inh_of_main ~loc _tdecl = Typ.of_longident ~loc (Ldot (Lident "Format", "formatter")) method syn_of_main ~loc ?in_class _tdecl = Typ.ident ~loc "unit" method syn_of_param ~loc _ = Typ.ident ~loc "unit" method inh_of_param ~loc tdecl _name = self#inh_of_main ~loc tdecl method plugin_class_params ~loc typs ~typname = List.map typs ~f:Typ.from_caml @ [ Typ.var ~loc @@ Naming.make_extra_param typname ] (* Adapted to generate only single method per constructor definition *) method on_tuple_constr ~loc ~is_self_rec ~mutual_decls ~inhe tdecl constr_info ts = let constr_name = match constr_info, ts with | Some (`Poly s), [] -> sprintf "`%s" s | Some (`Poly s), _ -> sprintf "`%s " s | Some (`Normal s), [] -> sprintf "%s" s | Some (`Normal s), _ -> sprintf "%s " s | None, _ -> "" in if List.length ts = 0 then app_format_fprintf ~loc inhe @@ Exp.string_const ~loc constr_name else ( let fmt = List.map ts ~f:(fun _ -> "%a") |> String.concat ~sep:",@,@ " in let fmt = sprintf "%s@[(@,%s@,)@]" constr_name fmt in List.fold_left ts ~f:(fun acc (name, typ) -> Exp.app_list ~loc acc [ self#do_typ_gen ~loc ~is_self_rec ~mutual_decls tdecl typ ; Exp.ident ~loc name ]) ~init:(app_format_fprintf ~loc inhe @@ Exp.string_const ~loc fmt)) method on_record_declaration ~loc ~is_self_rec ~mutual_decls tdecl labs = let pat = Pat.record ~loc @@ List.map labs ~f:(fun l -> Lident l.pld_name.txt, Pat.var ~loc l.pld_name.txt) in let methname = sprintf "do_%s" tdecl.ptype_name.txt in let fmt = List.fold_left labs ~init:"" ~f:(fun acc x -> sprintf "%s@,@ @,@[%s@,=@,%%a;@]" acc x.pld_name.txt) in let fmt_name = gen_symbol ~prefix:"fmt" () in [ Cf.method_concrete ~loc methname @@ Exp.fun_ ~loc (Pat.sprintf "%s" ~loc fmt_name) @@ Exp.fun_ ~loc pat @@ List.fold_left labs ~f:(fun acc { pld_name; pld_type } -> Exp.app_list ~loc acc [ self#do_typ_gen ~loc ~is_self_rec ~mutual_decls tdecl pld_type ; Exp.ident ~loc pld_name.txt ]) ~init: (app_format_fprintf ~loc (Exp.sprintf "%s" ~loc fmt_name) @@ Exp.string_const ~loc @@ sprintf "{@[<hov>%s@]@ }@," fmt) ] method! on_record_constr ~loc ~is_self_rec ~mutual_decls ~inhe tdecl info bindings labs = let cname = match info with | `Normal s -> s | `Poly s -> s in let fmt = List.fold_left labs ~init:"" ~f:(fun acc l -> sprintf "%s@,@ @,@[%s@,=@,%%a;@]" acc l.pld_name.txt) in List.fold_left bindings ~f:(fun acc (name, _, typ) -> Exp.app_list ~loc acc [ self#do_typ_gen ~loc ~is_self_rec ~mutual_decls tdecl typ ; Exp.ident ~loc name ]) ~init: (app_format_fprintf ~loc inhe @@ Exp.string_const ~loc @@ sprintf "%s {@[<hov>%s@]@ }@," cname fmt) end let create = (new g :> P.plugin_constructor) end let register () = Expander.register_plugin trait_name (module Make : Plugin_intf.MAKE) let () = register ()
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>