···1111 module T = Types
1212 module String_map = Value.String_map
1313 module Symbol_map = Value.Symbol_map
1414+ module Symbol_table = Value.Symbol_table
14151516 type located = Value.t Range.located
1617end
···90919192module Tape = Tape_effect.Make ()
92939393-module Heap = Algaeff.State.Make (struct
9494- type t = Value.obj Symbol_map.t
9595-end)
9696-9797-module Emitted_trees = Algaeff.State.Make (struct
9898- type t = T.content T.article list
9999-end)
100100-101101-module Jobs = Algaeff.State.Make (struct
102102- type t = Job.job Range.located list
103103-end)
104104-105105-module Frontmatter = Algaeff.State.Make (struct
106106- type t = T.content T.frontmatter
107107-end)
108108-10994type eval_env = {
11095 mode: eval_mode;
11196 config: Config.t;
11297 lex_env: Value.t String_map.t;
11398 dyn_env: Value.t Symbol_map.t;
9999+ jobs: Job.job Range.located Stack.t;
100100+ emitted_trees: T.content T.article Stack.t;
101101+ heap: Value.obj Symbol_table.t;
102102+ mutable frontmatter: T.content T.frontmatter;
114103}
115104116116-let initial_eval_env config : eval_env =
105105+let initial_eval_env config frontmatter : eval_env =
117106 {
118107 mode = Text_mode;
119108 config;
120109 lex_env = String_map.empty;
121110 dyn_env = Symbol_map.empty;
111111+ jobs = Stack.create ();
112112+ emitted_trees = Stack.create ();
113113+ heap = Symbol_table.create 100;
114114+ frontmatter;
122115 }
123116124124-let get_current_uri ~loc =
125125- match (Frontmatter.get ()).uri with
117117+let get_current_uri ~env ~loc =
118118+ match env.frontmatter.uri with
126119 | Some uri -> uri
127120 | None ->
128121 Reporter.fatal ?loc Internal_error
···319312 | None -> None
320313 in
321314 let subtree = eval_tree_inner ~env ?uri nodes in
322322- let frontmatter = Frontmatter.get () in
315315+ let frontmatter = env.frontmatter in
323316 let subtree =
324317 {
325318 subtree with
···329322 in
330323 begin match uri with
331324 | Some uri ->
332332- Emitted_trees.modify @@ List.cons subtree;
325325+ Stack.push subtree env.emitted_trees;
333326 let transclusion = T.{href = uri; target = Full flags} in
334327 emit_content_node ~env ~loc @@ Transclude transclusion
335328 | None ->
···354347 begin match query_arg.value with
355348 | Dx_query query ->
356349 let job = Job.Syndicate (Json_blob {blob_uri; query}) in
357357- Jobs.modify @@ List.cons @@ Range.locate_opt loc job;
350350+ Stack.push (Range.locate_opt loc job) env.jobs;
358351 process_tape ~env ()
359352 | other ->
360353 Reporter.fatal ?loc:query_arg.loc
361354 (Type_error {expected = [Dx_query]; got = Some other})
362355 end
363356 | Syndicate_current_tree_as_atom_feed ->
364364- let source_uri = get_current_uri ~loc:node.loc in
357357+ let source_uri = get_current_uri ~env ~loc:node.loc in
365358 let feed_uri =
366359 let components =
367360 URI.append_path_component (URI.path_components source_uri) "atom.xml"
···369362 URI.with_path_components components source_uri
370363 in
371364 let job = Job.Syndicate (Atom_feed {source_uri; feed_uri}) in
372372- Jobs.modify @@ List.cons @@ Range.locate_opt loc job;
365365+ Stack.push (Range.locate_opt loc job) env.jobs;
373366 process_tape ~env ()
374367 | Embed_tex ->
375368 let preamble, body =
···411404 ]
412405 in
413406 let artefact = T.{hash; content; sources} in
414414- Jobs.modify (List.cons (Range.locate_opt loc (Job.LaTeX_to_svg job)));
407407+ Stack.push (Range.locate_opt loc (Job.LaTeX_to_svg job)) env.jobs;
415408 emit_content_node ~env ~loc @@ T.Artefact artefact
416409 | Route_asset ->
417410 let Range.{value = source_path; loc = path_loc} =
···428421 List.fold_right add methods Value.Method_table.empty
429422 in
430423 let sym = Symbol.named ["obj"] in
431431- Heap.modify @@ Symbol_map.add sym Value.{prototype = None; methods = table};
424424+ Symbol_table.replace env.heap sym Value.{prototype = None; methods = table};
432425 focus ~env ?loc:node.loc @@ Value.Obj sym
433426 | Patch {obj; self; super; methods} ->
434427 let obj_ptr =
···441434 List.fold_right add methods Value.Method_table.empty
442435 in
443436 let sym = Symbol.named ["obj"] in
444444- Heap.modify
445445- @@ Symbol_map.add sym Value.{prototype = Some obj_ptr; methods = table};
437437+ Symbol_table.replace env.heap sym
438438+ Value.{prototype = Some obj_ptr; methods = table};
446439 focus ~env ?loc:node.loc @@ Value.Obj sym
447440 | Group (d, body) ->
448441 let l, r = delim_to_strings d in
···475468 eval_tape ~env:{env with lex_env} mthd.body
476469 | None -> (
477470 match obj.prototype with
478478- | Some proto -> call_method ~env @@ Symbol_map.find proto @@ Heap.get ()
471471+ | Some proto -> call_method ~env @@ Symbol_table.find env.heap proto
479472 | None ->
480473 Reporter.fatal ?loc:node.loc (Unbound_method (method_name, obj)))
481474 in
482482- let result = call_method ~env @@ Symbol_map.find sym @@ Heap.get () in
475475+ let result = call_method ~env @@ Symbol_table.find env.heap sym in
483476 focus ~env ?loc:node.loc result
484477 | Put (k, v, body) ->
485478 let k =
···515508 | Verbatim str -> emit_content_node ~env ~loc @@ CDATA str
516509 | Title ->
517510 let title = pop_content_arg ~env ~loc in
518518- Frontmatter.modify (fun fm -> {fm with title = Some title});
511511+ env.frontmatter <- {env.frontmatter with title = Some title};
519512 process_tape ~env ()
520513 | Parent ->
521514 let parent_arg = eval_pop_arg ~env ~loc in
···527520 ~extra_remarks:
528521 [Asai.Diagnostic.loctext "Expected valid URI in parent declaration"]
529522 in
530530- Frontmatter.modify (fun fm -> {fm with designated_parent = Some parent});
523523+ env.frontmatter <- {env.frontmatter with designated_parent = Some parent};
531524 process_tape ~env ()
532525 | Meta ->
533526 let k = pop_text_arg ~env ~loc in
534527 let v = pop_content_arg ~env ~loc in
535535- Frontmatter.modify (fun fm -> {fm with metas = fm.metas @ [(k, v)]});
528528+ env.frontmatter <-
529529+ {env.frontmatter with metas = env.frontmatter.metas @ [(k, v)]};
536530 process_tape ~env ()
537531 | Attribution (role, type_) ->
538532 let arg = eval_pop_arg ~env ~loc in
···556550 T.Content_vertex (extract_content arg)
557551 in
558552 let attribution = T.{role; vertex} in
559559- Frontmatter.modify (fun fm ->
560560- {fm with attributions = fm.attributions @ [attribution]});
553553+ env.frontmatter <-
554554+ {
555555+ env.frontmatter with
556556+ attributions = env.frontmatter.attributions @ [attribution];
557557+ };
561558 process_tape ~env ()
562559 | Tag type_ ->
563560 let arg = eval_pop_arg ~env ~loc in
···576573 ];
577574 T.Content_vertex (extract_content arg)
578575 in
579579- Frontmatter.modify (fun fm -> {fm with tags = fm.tags @ [vertex]});
576576+ env.frontmatter <-
577577+ {env.frontmatter with tags = env.frontmatter.tags @ [vertex]};
580578 process_tape ~env ()
581579 | Date ->
582580 let date_str = pop_text_arg ~env ~loc in
···586584 ~extra_remarks:
587585 [Asai.Diagnostic.loctextf "Invalid date string `%s`" date_str]
588586 | Some date ->
589589- Frontmatter.modify (fun fm -> {fm with dates = fm.dates @ [date]});
587587+ env.frontmatter <-
588588+ {env.frontmatter with dates = env.frontmatter.dates @ [date]};
590589 process_tape ~env ()
591590 end
592591 | Number ->
593592 let num = pop_text_arg ~env ~loc in
594594- Frontmatter.modify (fun fm -> {fm with number = Some num});
593593+ env.frontmatter <- {env.frontmatter with number = Some num};
595594 process_tape ~env ()
596595 | Taxon ->
597596 let taxon = Some (pop_content_arg ~env ~loc) in
598598- Frontmatter.modify (fun fm -> {fm with taxon});
597597+ env.frontmatter <- {env.frontmatter with taxon};
599598 process_tape ~env ()
600599 | Sym sym -> focus ~env ?loc:node.loc @@ Value.Sym sym
601600 | Dx_prop (rel, args) ->
···648647 emit_content_node ~env ~loc:node.loc @@ T.Datalog_script [script]
649648 | Current_tree ->
650649 emit_content_node ~env ~loc:node.loc
651651- @@ T.Uri (get_current_uri ~loc:node.loc)
650650+ @@ T.Uri (get_current_uri ~env ~loc:node.loc)
652651653652and eval_var ~env ~loc (x : string) =
654653 match String_map.find_opt x env.lex_env with
···715714 let attribution_is_author attr =
716715 match T.(attr.role) with T.Author -> true | _ -> false
717716 in
718718- let outer_frontmatter = Frontmatter.get () in
717717+ let outer_frontmatter = env.frontmatter in
719718 let attributions =
720719 List.filter attribution_is_author outer_frontmatter.attributions
721720 in
···724723 ?source_path:outer_frontmatter.source_path ~dates:outer_frontmatter.dates
725724 ()
726725 in
727727- let@ () = Frontmatter.run ~init:frontmatter in
726726+ let env = {env with frontmatter} in
728727 let mainmatter =
729728 {value = eval_tape ~env syn; loc = None} |> extract_content
730729 in
731731- let frontmatter = Frontmatter.get () in
730730+ let frontmatter = env.frontmatter in
732731 let backmatter =
733732 match uri with Some uri -> default_backmatter ~uri | None -> Content []
734733 in
···748747 ~emit:push
749748 @@ fun () ->
750749 let fm = T.default_frontmatter ~uri ?source_path () in
751751- let env = initial_eval_env config in
752752- let@ () = Frontmatter.run ~init:fm in
753753- let@ () = Emitted_trees.run ~init:[] in
754754- let@ () = Jobs.run ~init:[] in
755755- let@ () = Heap.run ~init:Symbol_map.empty in
750750+ let env = initial_eval_env config fm in
756751 let main = eval_tree_inner ~env ~uri tree in
757757- let side = Emitted_trees.get () in
758758- let jobs = Jobs.get () in
752752+ let side = env.emitted_trees |> Stack.to_seq |> List.of_seq in
753753+ let jobs = env.jobs |> Stack.to_seq |> List.of_seq in
759754 {articles = main :: side; jobs}
760755 in
761756 (res, !diagnostics)
+3
lib/core/Symbol.ml
···8899let counter = ref 0
10101111+let hash = Hashtbl.hash
1212+1113let named path =
1214 counter := !counter + 1;
1315 (path, !counter)
···1719let pp fmt (sym, ix) = Format.fprintf fmt "%a@%i" Trie.pp_path sym ix
1820let show x = Format.asprintf "%a" pp x
1921let compare = compare
2222+let equal = ( = )
2023let name (sym, _) = sym
2124let repr : t Repr.t = Repr.pair (Repr.list Repr.string) Repr.int
+2
lib/core/Symbol.mli
···1414val fresh : unit -> t
1515val clone : t -> t
1616val compare : t -> t -> int
1717+val hash : t -> int
1818+val equal : t -> t -> bool
1719val repr : t Repr.t