diff options
| author | Marcos Magueta <maguetamarcos@gmail.com> | 2026-09-26 15:30:53 -0300 |
|---|---|---|
| committer | Marcos Magueta <maguetamarcos@gmail.com> | 2026-09-26 15:30:53 -0300 |
| commit | e32ba6294781691846c3ab19281fe977350b4d0f (patch) | |
| tree | f38e92ba2fc03e966d7263c7ee2e0b5d7983ebae /lib/prl | |
| parent | be375a52da6174dfda5b68617d27e1542cc80499 (diff) | |
| download | Sakura-e32ba6294781691846c3ab19281fe977350b4d0f.tar.gz Sakura-e32ba6294781691846c3ab19281fe977350b4d0f.zip | |
preparation cleanup for RNT integration
Diffstat (limited to 'lib/prl')
| -rw-r--r-- | lib/prl/ast.ml | 15 | ||||
| -rw-r--r-- | lib/prl/executor.ml | 38 | ||||
| -rw-r--r-- | lib/prl/parser.ml | 14 | ||||
| -rw-r--r-- | lib/prl/runtime.ml | 75 | ||||
| -rw-r--r-- | lib/prl/sublanguage.ml | 11 |
5 files changed, 0 insertions, 153 deletions
diff --git a/lib/prl/ast.ml b/lib/prl/ast.ml deleted file mode 100644 index ab63c31..0000000 --- a/lib/prl/ast.ml +++ /dev/null @@ -1,15 +0,0 @@ -open Sexplib.Std - -type function_predicate = - { name: string; - schema: (string * string) list; - symbol: string; - purity: Conventions.Purity.t; - cardinality: Conventions.Cardinality.t } -[@@deriving sexp] - -type statement = - | LoadLibrary of string - | DefineFunctionPredicate of function_predicate - | ListFunctionPredicates -[@@deriving sexp] diff --git a/lib/prl/executor.ml b/lib/prl/executor.ml deleted file mode 100644 index 4a055ae..0000000 --- a/lib/prl/executor.ml +++ /dev/null @@ -1,38 +0,0 @@ -module Make (NT : Nt.S) = struct - module Error = struct - open Condition - - (* TODO: more structure *) - let parse_error msg = condition "parse-error" msg empty - let runtime_error msg = condition "runtime-error" msg empty - - let unknown_plugin_symbol name = - condition "unknown-plugin-symbol" "Unknown plugin" ("name" |=| of_string name) - - let relation_not_found name = - condition "relation-not-found" "Relation not found" ("name" |=| of_string name) - end - - let ( let* ) = Result.bind - - (* TODO: PRL function predicates are OCaml shared-library callbacks that - produce tuples at runtime. To make their output joinable inside the - Tarski VM they need to be materialised into a temporary relation in the - InMemoryBackend and then SCANned like any other stored relation. This - requires a `rnt_register_ephemeral_relation` C API call that does not - yet exist. Disable PRL execution until that bridge is in place. *) - - let execute (_ctx : Sublanguage_context.t) (_stmt : Ast.statement) : - (Sublanguage_types.result, Condition.t) result = - Error - (Error.runtime_error - "PRL execution is temporarily disabled pending VM callback-cursor support" ) - - let _execute_load_library _ctx _path = Error (Error.runtime_error "PRL disabled") - - let _execute_define_function_predicate _ctx (_spec : Ast.function_predicate) = - let* _ = Ok () in - Error (Error.runtime_error "PRL disabled") - - let _execute_list_function_predicates _ctx = Error (Error.runtime_error "PRL disabled") -end diff --git a/lib/prl/parser.ml b/lib/prl/parser.ml deleted file mode 100644 index e009b97..0000000 --- a/lib/prl/parser.ml +++ /dev/null @@ -1,14 +0,0 @@ -module Error = struct - open Condition - - let parse_error msg = condition "parse-error" msg empty -end - -let of_sexp sexp = - let sexp = match sexp with Sexplib.Sexp.List [atom] -> atom | other -> other in - match Ast.statement_of_sexp sexp with - | stmt -> Ok stmt - | exception exn -> Error (Error.parse_error (Printexc.to_string exn)) - -let of_string s = of_sexp (Sexplib.Sexp.of_string s) -let to_string stmt = Ast.sexp_of_statement stmt |> Sexplib.Sexp.to_string_hum diff --git a/lib/prl/runtime.ml b/lib/prl/runtime.ml deleted file mode 100644 index 103b5c1..0000000 --- a/lib/prl/runtime.ml +++ /dev/null @@ -1,75 +0,0 @@ -type t = {loaded_libraries: (string, unit) Hashtbl.t; mutex: Mutex.t} - -let state : t = {loaded_libraries= Hashtbl.create 16; mutex= Mutex.create ()} - -let load_library path : (unit, string) result = - Mutex.protect state.mutex (fun () -> - if Hashtbl.mem state.loaded_libraries path then Ok () - else - try - Dynlink.loadfile path; - Hashtbl.replace state.loaded_libraries path (); - Ok () - with Dynlink.Error e -> Error (Dynlink.error_message e) ) - -(* Convert an engine materialized tuple to the plugin's (string * Obj.t) list format. *) -let to_plugin_row (schema : Schema.t) (tuple : Tuple.materialized) : Sakura_prl_api.tuple option = - let rec go acc = function - | [] -> Some (List.rev acc) - | (attr_name, _) :: rest -> ( - match Tuple.AttributeMap.find_opt attr_name tuple.attributes with - | None -> None - | Some attr -> go ((attr_name, attr.Attribute.value) :: acc) rest ) - in - go [] schema - -(* Convert a plugin row back to an engine materialized tuple. *) -let of_plugin_row relation_name (schema : Schema.t) (row : Sakura_prl_api.tuple) : - Tuple.materialized option = - let rec go acc = function - | [] -> Some {Tuple.relation= relation_name; attributes= acc} - | (attr_name, _) :: rest -> ( - match List.assoc_opt attr_name row with - | None -> None - | Some value -> go (Tuple.AttributeMap.add attr_name {Attribute.value} acc) rest ) - in - go Tuple.AttributeMap.empty schema - -(* Wrap a list of plugin rows as a generator. Uses an array for O(1) indexing. *) -let rows_to_generator relation_name schema (rows : Sakura_prl_api.tuple list) : Generator.t = - let arr = Array.of_list rows in - let n = Array.length arr in - let rec gen i _pos = - if i >= n then Generator.Done - else - match of_plugin_row relation_name schema arr.(i) with - | None -> Generator.Error "Plugin row does not conform to predicate schema." - | Some tuple -> Generator.Value (Tuple.Materialized tuple, gen (i + 1)) - in - gen 0 - -let make_generator relation_name schema (impl : Sakura_prl_api.implementation) - (bindings : Sakura_prl_api.tuple) : Generator.t = - match impl.produce with - | None -> fun _ -> Generator.Done - | Some produce -> ( - let rows_result = lazy (produce bindings) in - fun _pos -> - match Lazy.force rows_result with - | Error e -> Generator.Error e - | Ok rows -> rows_to_generator relation_name schema rows _pos ) - -let make_producer relation_name schema (impl : Sakura_prl_api.implementation) : Relation.producer = - fun bindings -> make_generator relation_name schema impl bindings - -let make_membership_criteria schema (impl : Sakura_prl_api.implementation) : Tuple.t -> bool = - match impl.membership_criteria with - | None -> fun _ -> false - | Some check -> ( - (* fun _tree_of -> *) - function - | Tuple.NonMaterialized _ -> false - | Tuple.Materialized m -> ( - match to_plugin_row schema m with - | None -> false - | Some row -> ( match check row with Ok b -> b | Error _ -> false ) ) ) diff --git a/lib/prl/sublanguage.ml b/lib/prl/sublanguage.ml deleted file mode 100644 index 405d266..0000000 --- a/lib/prl/sublanguage.ml +++ /dev/null @@ -1,11 +0,0 @@ -module Make (NT : Nt.S) = struct - module Exec = Executor.Make (NT) - - type configuration = unit - type ast = Ast.statement - - let name = "prl" - let parse _ = Ok () - let parse_sexp sexp = Parser.of_sexp sexp - let execute = Exec.execute -end |
