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:"<builtins>" [%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)