aboutsummaryrefslogtreecommitdiffstats
path: root/lib/prl
diff options
context:
space:
mode:
authorMarcos Magueta <maguetamarcos@gmail.com>2026-09-26 15:30:53 -0300
committerMarcos Magueta <maguetamarcos@gmail.com>2026-09-26 15:30:53 -0300
commite32ba6294781691846c3ab19281fe977350b4d0f (patch)
treef38e92ba2fc03e966d7263c7ee2e0b5d7983ebae /lib/prl
parentbe375a52da6174dfda5b68617d27e1542cc80499 (diff)
downloadSakura-e32ba6294781691846c3ab19281fe977350b4d0f.tar.gz
Sakura-e32ba6294781691846c3ab19281fe977350b4d0f.zip
preparation cleanup for RNT integration
Diffstat (limited to 'lib/prl')
-rw-r--r--lib/prl/ast.ml15
-rw-r--r--lib/prl/executor.ml38
-rw-r--r--lib/prl/parser.ml14
-rw-r--r--lib/prl/runtime.ml75
-rw-r--r--lib/prl/sublanguage.ml11
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