diff options
| author | Marcos Magueta <maguetamarcos@gmail.com> | 2026-10-07 18:25:43 -0300 |
|---|---|---|
| committer | Marcos Magueta <maguetamarcos@gmail.com> | 2026-10-07 18:25:43 -0300 |
| commit | 932e657e38665afa1da1aab549977841abbd9dcf (patch) | |
| tree | b2c0b3d30b7aaab7347300b3932a9f03e4f64f9a /lib/kernel/Source.ml | |
| parent | cfc641a9bb97c94e5993f895a8bcdf24214adc83 (diff) | |
| download | RNT-932e657e38665afa1da1aab549977841abbd9dcf.tar.gz RNT-932e657e38665afa1da1aab549977841abbd9dcf.zip | |
drop journal in favor of local branch history
Diffstat (limited to 'lib/kernel/Source.ml')
| -rw-r--r-- | lib/kernel/Source.ml | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/lib/kernel/Source.ml b/lib/kernel/Source.ml index b3b7389..e5de6e8 100644 --- a/lib/kernel/Source.ml +++ b/lib/kernel/Source.ml @@ -34,25 +34,35 @@ let evaluator ~language run = method to_string = language ^ "-evaluator" method protocols : Protocols.Handle.protocol list = [Protocols.Evaluator.make self] - method invoke program = + method invoke program ~within = match text program with | None -> Error (Error.not_a_program language) | Some (given, _) when given <> language -> Error (Error.foreign language given) - | Some (_, source) -> run source + | Some (_, source) -> run ~within source end -let run root ~language source = +let evaluators = Path.("system" @/ "evaluator" @/ this) + +let bind directory ~within language program = let open Utilities.Result in let* evaluator = - Path.lookup root Path.("evaluator" @/ language @/ this) + Path.lookup directory Path.(language @/ this) |> Result.map_error (fun _ -> Error.no_evaluator language) in - let* evaluator = Protocols.Evaluator.require evaluator in - Protocols.Evaluator.invoke evaluator (program ~language source) + Fun.protect + ~finally:(fun () -> Protocols.Handle.release evaluator) + (fun () -> + let* evaluator = Protocols.Evaluator.require evaluator in + Protocols.Evaluator.invoke evaluator program ~within ) + +let run root ~language ~within source = + let open Utilities.Result in + let* directory = Path.lookup root evaluators in + bind directory ~within language (program ~language source) let register root ~language evaluator = let open Utilities.Result in - let* evaluators = Path.lookup root Path.("evaluator" @/ this) in - let* registry = Protocols.Handle.require Protocols.Registry.from evaluators in + let* directory = Path.lookup root evaluators in + let* registry = Protocols.Handle.require Protocols.Registry.from directory in let* _ = Protocols.Registry.update registry language None (Some evaluator) in Ok () |
