···1010open struct
1111 module T = Types
1212 module Env = Value.Env
1313+ module Symbol_map = Value.Symbol_map
1314 type located = Value.t Range.located
1415end
1516···73747475module Tape = Tape_effect.Make ()
7576module Lex_env = Algaeff.Reader.Make(struct type t = Value.t Env.t end)
7676-module Dyn_env = Algaeff.Reader.Make(struct type t = Value.t Env.t end)
7777+module Dyn_env = Algaeff.Reader.Make(struct type t = Value.t Symbol_map.t end)
7778module Config_env = Algaeff.Reader.Make(struct type t = Config.t end)
7878-module Heap = Algaeff.State.Make(struct type t = Value.obj Env.t end)
7979+module Heap = Algaeff.State.Make(struct type t = Value.obj Symbol_map.t end)
7980module Emitted_trees = Algaeff.State.Make(struct type t = T.content T.article list end)
8081module Jobs = Algaeff.State.Make(struct type t = Job.job Range.located list end)
8182module Frontmatter = Algaeff.State.Make(struct type t = T.content T.frontmatter end)
···8990let get_transclusion_flags ~loc =
9091 let dynenv = Dyn_env.read () in
9192 let get_bool key =
9292- let@ value = Option.map @~ Env.find_opt key dynenv in
9393+ let@ value = Option.map @~ Symbol_map.find_opt key dynenv in
9394 extract_bool @@ Range.locate_opt loc value
9495 in
9596 let module S = Expand.Builtins.Transclude in
···185186 emit_content_node ~loc @@ T.prim p @@ T.Content content
186187 | Fun (xs, body) ->
187188 let env = Lex_env.read () in
188188- focus_clo ?loc env xs body
189189+ focus_clo ?loc env (List.map (fun (info, x) -> info, Some x) xs) body
189190 | Ref ->
190191 begin
191192 match eval_pop_arg ~loc |> extract_uri with
···360361 let env = Lex_env.read () in
361362 let add (name, body) =
362363 let super = Symbol.fresh () in
363363- Value.Method_table.add name Value.{body; self; super; env}
364364+ Value.Method_table.add name Value.{body; self; super = None; env}
364365 in
365366 List.fold_right add methods Value.Method_table.empty
366367 in
367368 let sym = Symbol.named ["obj"] in
368368- Heap.modify @@ Env.add sym Value.{prototype = None; methods = table};
369369+ Heap.modify @@ Symbol_map.add sym Value.{prototype = None; methods = table};
369370 focus ?loc: node.loc @@ Value.Obj sym
370371 | Patch {obj; self; super; methods} ->
371372 let obj_ptr = {node with value = obj} |> Range.map eval_tape |> extract_obj_ptr in
···379380 List.fold_right add methods Value.Method_table.empty
380381 in
381382 let sym = Symbol.named ["obj"] in
382382- Heap.modify @@ Env.add sym Value.{prototype = Some obj_ptr; methods = table};
383383+ Heap.modify @@ Symbol_map.add sym Value.{prototype = Some obj_ptr; methods = table};
383384 focus ?loc: node.loc @@ Value.Obj sym
384385 | Group (d, body) ->
385386 let l, r = delim_to_strings d in
···395396 match Value.Method_table.find_opt method_name obj.methods with
396397 | Some mthd ->
397398 let env =
398398- let env = Env.add mthd.self (Value.Obj sym) mthd.env in
399399+ let env =
400400+ match mthd.self with
401401+ | None -> mthd.env
402402+ | Some self -> Env.add self (Value.Obj sym) mthd.env
403403+ in
399404 match proto_val with
400405 | None -> env
401406 | Some proto_val ->
402402- Env.add mthd.super proto_val env
407407+ match mthd.super with
408408+ | None -> env
409409+ | Some super -> Env.add super proto_val env
403410 in
404411 let@ () = Lex_env.run ~env in
405412 eval_tape mthd.body
406413 | None ->
407414 match obj.prototype with
408415 | Some proto ->
409409- call_method @@ Env.find proto @@ Heap.get ()
416416+ call_method @@ Symbol_map.find proto @@ Heap.get ()
410417 | None ->
411418 Reporter.fatal
412419 ?loc: node.loc
413420 (Unbound_method (method_name, obj))
414421 in
415415- let result = call_method @@ Env.find sym @@ Heap.get () in
422422+ let result = call_method @@ Symbol_map.find sym @@ Heap.get () in
416423 focus ?loc: node.loc result
417424 | Put (k, v, body) ->
418425 let k = {node with value = k} |> Range.map eval_tape |> extract_sym in
419426 let body =
420420- let@ () = Dyn_env.scope (Env.add k (eval_tape v)) in
427427+ let@ () = Dyn_env.scope (Symbol_map.add k (eval_tape v)) in
421428 eval_tape body
422429 in
423430 focus ?loc: node.loc body
424431 | Default (k, v, body) ->
425432 let k = {node with value = k} |> Range.map eval_tape |> extract_sym in
426433 let body =
427427- let upd flenv = if Env.mem k flenv then flenv else Env.add k (eval_tape v) flenv in
434434+ let upd flenv = if Symbol_map.mem k flenv then flenv else Symbol_map.add k (eval_tape v) flenv in
428435 let@ () = Dyn_env.scope upd in
429436 eval_tape body
430437 in
···433440 let k = {node with value = k} |> Range.map eval_tape |> extract_sym in
434441 let env = Dyn_env.read () in
435442 begin
436436- match Env.find_opt k env with
443443+ match Symbol_map.find_opt k env with
437444 | None ->
438445 Reporter.fatal
439446 ?loc: node.loc
···558565 | Current_tree ->
559566 emit_content_node ~loc: node.loc @@ T.Uri (get_current_uri ~loc: node.loc)
560567561561-and eval_var ~loc x =
568568+and eval_var ~loc (x : string) =
562569 let env = Lex_env.read () in
563570 match Env.find_opt x env with
564571 | Some v -> focus ?loc v
···587594 ~extra_remarks: [Asai.Diagnostic.loctextf "Expected solitary node but got %a / %a" Value.pp v Value.pp v']
588595 end
589596590590-and focus_clo ?loc rho xs body =
597597+and focus_clo ?loc rho (xs : string option binding list) body =
591598 match xs with
592599 | [] ->
593600 focus ?loc @@
···599606 let yval =
600607 match info with
601608 | Strict -> eval_tape arg.value
602602- | Lazy -> Clo (Lex_env.read (), [(Strict, Symbol.fresh ())], arg.value)
609609+ | Lazy -> Clo (Lex_env.read (), [(Strict, None)], arg.value)
603610 in
604604- let rhoy = Env.add y yval rho in
611611+ let rhoy = match y with Some y -> Env.add y yval rho | None -> rho in
605612 focus_clo ?loc rhoy ys body
606613 | None ->
607614 begin
···662669 let@ () = Frontmatter.run ~init: fm in
663670 let@ () = Emitted_trees.run ~init: [] in
664671 let@ () = Jobs.run ~init: [] in
665665- let@ () = Heap.run ~init: Env.empty in
672672+ let@ () = Heap.run ~init: Symbol_map.empty in
666673 let@ () = Lex_env.run ~env: Env.empty in
667667- let@ () = Dyn_env.run ~env: Env.empty in
674674+ let@ () = Dyn_env.run ~env: Symbol_map.empty in
668675 let@ () = Config_env.run ~env: config in
669676 let main = eval_tree_inner ~uri tree in
670677 let side = Emitted_trees.get () in
+17-21
lib/compiler/Expand.ml
···158158 Sc.include_singleton path @@ (Xmlns {prefix; xmlns}, node.loc);
159159 expand_eff ~forest rest
160160 | Object {self; methods} ->
161161- let self, methods =
161161+ let methods =
162162 let@ () = Sc.section [] in
163163- let sym = Symbol.fresh () in
164164- let var = Range.{value = Syn.Var sym; loc = node.loc} in (* TODO: correct the location *)
165163 begin
166164 let@ self = Option.iter @~ self in
167167- Sc.import_singleton self @@ (Term [var], node.loc) (* TODO: correct the location*)
165165+ let var = Range.{value = Syn.Var self; loc = node.loc} in (* TODO: correct the location *)
166166+ Sc.import_singleton [self] @@ (Term [var], node.loc) (* TODO: correct the location*)
168167 end;
169169- sym, List.map (expand_method ~forest) methods
168168+ List.map (expand_method ~forest) methods
170169 in
171170 {node with value = Object {self; methods}} :: expand_eff ~forest rest
172172- | Patch {obj; self; methods} ->
171171+ | Patch {obj; self; super; methods} ->
173172 let obj = expand_eff ~forest obj in
174174- let self, super, methods =
173173+ let methods =
175174 let@ () = Sc.section [] in
176176- let self_sym = Symbol.fresh () in
177177- let super_sym = Symbol.fresh () in
178178- let self_var = Range.locate_opt None @@ Syn.Var self_sym in
179179- let super_var = Range.locate_opt None @@ Syn.Var super_sym in
180175 begin
181176 let@ self = Option.iter @~ self in
182182- Sc.import_singleton self @@ (Term [self_var], node.loc);
183183- (* TODO: correct location*)
184184- Sc.import_singleton (self @ ["super"]) @@ (Term [super_var], node.loc)
177177+ let self_var = Range.locate_opt None @@ Syn.Var self in
178178+ Sc.import_singleton [self] @@ (Term [self_var], node.loc);
179179+ let@ super = Option.iter @~ super in
180180+ let super_var = Range.locate_opt None @@ Syn.Var super in
181181+ Sc.import_singleton [super] @@ (Term [super_var], node.loc)
185182 end;
186186- self_sym, super_sym, List.map (expand_method ~forest) methods
183183+ List.map (expand_method ~forest) methods
187184 in
188185 let patched = Syn.Patch {obj; self; super; methods} in
189186 {node with value = patched} :: expand_eff ~forest rest
···268265269266and expand_lambda ~forest loc (xs, body) =
270267 let@ () = Sc.section [] in
271271- let syms =
268268+ let xs =
272269 let@ strategy, x = List.map @~ xs in
273273- let sym = Symbol.named x in
274274- let var = Range.locate_opt None @@ Syn.Var sym in
275275- Sc.import_singleton x @@ (Term [var], loc);
276276- strategy, sym
270270+ let var = Range.locate_opt None @@ Syn.Var x in
271271+ Sc.import_singleton [x] @@ (Term [var], loc);
272272+ strategy, x
277273 in
278278- Range.{value = Syn.Fun (syms, expand_eff ~forest body); loc}
274274+ Range.{value = Syn.Fun (xs, expand_eff ~forest body); loc}
279275280276let ignore_entered_range f x =
281277 let open Effect.Deep in
+7-6
lib/core/Code.ml
···99open struct module T = Types end
10101111type 'a _object = {
1212- self: Trie.path option;
1212+ self: string option;
1313 methods: (string * 'a) list
1414}
1515[@@deriving show, repr]
16161717type 'a patch = {
1818 obj: 'a;
1919- self: Trie.path option;
1919+ self: string option;
2020+ super: string option;
2021 methods: (string * 'a) list
2122}
2223[@@deriving show, repr]
···3031 | Hash_ident of string
3132 | Xml_ident of string option * string
3233 | Subtree of string option * t
3333- | Let of Trie.path * Trie.path binding list * t
3434+ | Let of Trie.path * string binding list * t
3435 | Open of Trie.path
3536 | Scope of t
3637 | Put of Trie.path * t
3738 | Default of Trie.path * t
3839 | Get of Trie.path
3939- | Fun of Trie.path binding list * t
4040+ | Fun of string binding list * t
4041 | Object of t _object
4142 | Patch of t patch
4243 | Call of t * string
4344 | Import of visibility * string
4444- | Def of Trie.path * Trie.path binding list * t
4545+ | Def of Trie.path * string binding list * t
4546 | Decl_xmlns of string * string
4647 | Alloc of Trie.path
4748 | Namespace of Trie.path * t
···9495 | Fun (b, t) -> Fun (b, f t)
9596 | Call (t, s) -> Call (f t, s)
9697 | Object {self; methods} -> Object {self; methods = List.map (fun (s, t) -> (s, f t)) methods}
9797- | Patch {obj; self; methods} -> Patch {obj = f obj; self; methods = List.map (fun (s, t) -> (s, f t)) methods}
9898+ | Patch {obj; self; super; methods} -> Patch {obj = f obj; self; super; methods = List.map (fun (s, t) -> (s, f t)) methods}
9899 | Text _
99100 | Verbatim _
100101 | Ident _
+6-5
lib/core/Code.mli
···1919 | Subtree of string option * t
2020 | Let of
2121 Trie.path
2222- * Trie.path binding list
2222+ * string binding list
2323 * t
2424 | Open of Trie.path
2525 | Scope of t
2626 | Put of Trie.path * t
2727 | Default of Trie.path * t
2828 | Get of Trie.path
2929- | Fun of Trie.path binding list * t
2929+ | Fun of string binding list * t
3030 | Object of t _object
3131 | Patch of t patch
3232 | Call of t * string
3333 | Import of visibility * string
3434 | Def of
3535 Trie.path
3636- * Trie.path binding list
3636+ * string binding list
3737 * t
3838 | Decl_xmlns of string * string
3939 | Alloc of Trie.path
···5151and t = node Range.located list
52525353and 'a _object = {
5454- self: Trie.path option;
5454+ self: string option;
5555 methods: (string * 'a) list;
5656}
57575858and 'a patch = {
5959 obj: 'a;
6060- self: Trie.path option;
6060+ self: string option;
6161+ super: string option;
6162 methods: (string * 'a) list;
6263}
6364
+2-2
lib/core/Reporter.ml
···4141 got: Value.t option;
4242 expected: expected_value list
4343 }
4444- | Unbound_fluid_symbol of (Symbol.t * Value.t Value.Env.t)
4545- | Unbound_lexical_symbol of (Symbol.t * Value.t Value.Env.t)
4444+ | Unbound_fluid_symbol of (Symbol.t * Value.t Value.Symbol_map.t)
4545+ | Unbound_lexical_symbol of (string * Value.t Value.Env.t)
4646 | Unresolved_identifier of ((Sc.data, R.P.tag) Trie.t [@opaque]) * Trie.path
4747 | Unresolved_xmlns of string
4848 | Reference_error of URI.t
+2-2
lib/core/Reporter.mli
···3636 got: Value.t option;
3737 expected: expected_value list
3838 }
3939- | Unbound_fluid_symbol of (Symbol.t * Value.t Value.Env.t)
4040- | Unbound_lexical_symbol of (Symbol.t * Value.t Value.Env.t)
3939+ | Unbound_fluid_symbol of (Symbol.t * Value.t Value.Symbol_map.t)
4040+ | Unbound_lexical_symbol of (string * Value.t Value.Env.t)
4141 | Unresolved_identifier of ((Resolver.Scope.data, Resolver.P.tag) Trie.t) * Trie.path
4242 | Unresolved_xmlns of string
4343 | Reference_error of URI.t
+4-4
lib/core/Syn.ml
···1414 | Math of math_mode * t
1515 | Link of {dest: t; title: t option}
1616 | Subtree of string option * t
1717- | Fun of Symbol.t binding list * t
1818- | Var of Symbol.t
1717+ | Fun of string binding list * t
1818+ | Var of string
1919 | Sym of Symbol.t
2020 | Put of t * t * t
2121 | Default of t * t * t
···2424 | TeX_cs of TeX_cs.t
2525 | Unresolved_ident of ((resolver_data, Range.t option) Trie.t [@opaque]) * Trie.path
2626 | Prim of Prim.t
2727- | Object of {self: Symbol.t; methods: (string * t) list}
2828- | Patch of {obj: t; self: Symbol.t; super: Symbol.t; methods: (string * t) list}
2727+ | Object of {self: string option; methods: (string * t) list}
2828+ | Patch of {obj: t; self: string option; super: string option; methods: (string * t) list}
2929 | Call of t * string
3030 | Results_of_query
3131 | Transclude
+10-6
lib/core/Value.ml
···991010open struct module T = Types end
11111212-module Env = struct
1313- include Map.Make(Symbol)
1212+module Make_env (S : sig include Map.OrderedType val pp : Format.formatter -> t -> unit end) = struct
1313+ include Map.Make(S)
1414 let pp (pp_el : Format.formatter -> 'a -> unit) (fmt : Format.formatter) (map : 'a t) =
1515 Format.fprintf fmt "@[<v1>{";
1616 begin
1717 let@ k, v = Seq.iter @~ to_seq map in
1818- Format.fprintf fmt "@[%a ~> %a@]@;" Symbol.pp k pp_el v
1818+ Format.fprintf fmt "@[%a ~> %a@]@;" S.pp k pp_el v
1919 end;
2020 Format.fprintf fmt "}@]"
2121end
22222323+module Env = Make_env (struct include String let pp = Format.pp_print_string end)
2424+module Symbol_map = Make_env (Symbol)
2525+2626+2327type t =
2428 | Content of T.content
2525- | Clo of t Env.t * Symbol.t binding list * Syn.t
2929+ | Clo of t Env.t * string option binding list * Syn.t
2630 | Dx_prop of (string, T.content T.vertex) Datalog_expr.prop
2731 | Dx_sequent of (string, T.content T.vertex) Datalog_expr.sequent
2832 | Dx_query of (string, T.content T.vertex) Datalog_expr.query
···34383539type obj_method = {
3640 body: Syn.t;
3737- self: Symbol.t;
3838- super: Symbol.t;
4141+ self: string option;
4242+ super: string option;
3943 env: t Env.t
4044}
4145[@@deriving show]
+2-2
lib/language_server/Analysis.ml
···3030 List.concat_map Code.children tree
31313232let paths_in_bindings =
3333- List.map snd
3333+ List.map (fun (_, x) -> [x])
34343535(* This function should not descend into the nodes!*)
3636let paths : Code.node Range.located -> _ = function
···4949 Some (path :: paths_in_bindings bindings, loc)
5050 | Patch {self; _}
5151 | Object {self; _;} ->
5252- Option.map (fun path -> [path], loc) self
5252+ Option.map (fun x -> [[x]], loc) self
5353 | Fun (bindings, _) -> Some (paths_in_bindings bindings, loc)
5454 | Subtree _
5555 | Group _
+1-5
lib/language_server/Document_symbols.ml
···3737 (* TODO: What should the symbol kind of a subtree be? *)
3838 Option.some @@ L.DocumentSymbol.create ~name ~range ~selectionRange ~kind: Namespace ()
3939 | Object {self; _} ->
4040- let name =
4141- match self with
4242- | Some path -> Format.asprintf "%a" pp_path path
4343- | None -> "anonymous"
4444- in
4040+ let name = Option.value ~default: "anonymous" self in
4541 Option.some @@ L.DocumentSymbol.create ~name ~range ~selectionRange ~kind: Object ()
4642 | Def (name, _, _) ->
4743 let name = Format.asprintf "%a" pp_path name in