From ba61dfd69504ec6263a9dee9931d93adeb6f3142 Mon Sep 17 00:00:00 2001 From: Rutger Broekhoff Date: Mon, 7 Jul 2025 21:52:08 +0200 Subject: Initialize repository --- lib/mininix/builtins.ml | 77 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 lib/mininix/builtins.ml (limited to 'lib/mininix/builtins.ml') diff --git a/lib/mininix/builtins.ml b/lib/mininix/builtins.ml new file mode 100644 index 0000000..0809668 --- /dev/null +++ b/lib/mininix/builtins.ml @@ -0,0 +1,77 @@ +open Core +open Nix2mininix + +let minimal_prelude = + mn_attr + [ + ("true", `Nonrec, Extraction.ELit (Extraction.LitBool true)); + ("false", `Nonrec, Extraction.ELit (Extraction.LitBool false)); + ("null", `Nonrec, Extraction.ELit Extraction.LitNull); + ("seq", `Nonrec, mn_abs [ "e1"; "e2" ] (mn_seq (mn_id "e1") (mn_id "e2"))); + ( "deepSeq", + `Nonrec, + mn_abs [ "e1"; "e2" ] (mn_deep_seq (mn_id "e1") (mn_id "e2")) ); + ("typeOf", `Nonrec, mn_abs [ "e" ] (mn_type_of (mn_id "e"))); + ("functionArgs", `Nonrec, mn_abs [ "f" ] (mn_function_args (mn_id "f"))); + ( "bitAnd", + `Nonrec, + mn_abs [ "x"; "y" ] (mn_bit_and (mn_id "x") (mn_id "y")) ); + ("bitOr", `Nonrec, mn_abs [ "x"; "y" ] (mn_bit_or (mn_id "x") (mn_id "y"))); + ( "bitXor", + `Nonrec, + mn_abs [ "x"; "y" ] (mn_bit_xor (mn_id "x") (mn_id "y")) ); + ("ceil", `Nonrec, mn_abs [ "x" ] (mn_ceil (mn_id "x"))); + ("floor", `Nonrec, mn_abs [ "x" ] (mn_floor (mn_id "x"))); + ("__mn_nearestEven", `Nonrec, mn_abs [ "x" ] (mn_nearest_even (mn_id "x"))); + ( "__mn_singleton", + `Nonrec, + mn_abs [ "x"; "e" ] (mn_singleton_attr (mn_id "x") (mn_id "e")) ); + ( "__mn_attr_delete", + `Nonrec, + mn_abs [ "as"; "x" ] (mn_delete_attr (mn_id "as") (mn_id "x")) ); + ( "__mn_attr_has_prim", + `Nonrec, + mn_abs [ "d"; "e" ] (mn_has_attr (mn_id "d") (mn_id "e")) ); + ("__mn_attr_match", `Nonrec, mn_abs [ "as" ] (mn_attr_match (mn_id "as"))); + ("__mn_list_match", `Nonrec, mn_abs [ "xs" ] (mn_list_match (mn_id "xs"))); + ( "__mn_string_match", + `Nonrec, + mn_abs [ "s" ] (mn_string_match (mn_id "s")) ); + ] + +(* Watch out to not introduce constructs here that refer to themselves using + the mnbi_* functions in Nix2mininix - this can cause undesired loops. *) +let builtins_nix = + Nix.elaborate (Nix.parse ~filename:"" [%blob "builtins.nix"]) + +let builtins = + Extraction.ELetAttr + (Extraction.ABS, minimal_prelude, Nix2mininix.from_nix builtins_nix) + +let exported_builtins = + [ + "__mn_assert"; + "__mn_attr_has"; + "__mn_attr_insertNew"; + "__mn_attr_select"; + "__mn_attr_selectOr"; + "abort"; + "false"; + "head"; + "map"; + "null"; + "removeAttrs"; + "tail"; + "throw"; + "toString"; + "true"; + ] + +let apply_prelude e = + let bindings = + mn_attr + (("builtins", `Nonrec, builtins) + :: List.map exported_builtins ~f:(fun x -> + (x, `Rec, mn_select_attr (mn_id "builtins") (mn_str x)))) + in + Extraction.ELetAttr (Extraction.ABS, bindings, e) -- cgit v1.2.3