diff options
Diffstat (limited to 'lib/mininix/builtins.ml')
-rw-r--r-- | lib/mininix/builtins.ml | 77 |
1 files changed, 77 insertions, 0 deletions
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 @@ | |||
1 | open Core | ||
2 | open Nix2mininix | ||
3 | |||
4 | let minimal_prelude = | ||
5 | mn_attr | ||
6 | [ | ||
7 | ("true", `Nonrec, Extraction.ELit (Extraction.LitBool true)); | ||
8 | ("false", `Nonrec, Extraction.ELit (Extraction.LitBool false)); | ||
9 | ("null", `Nonrec, Extraction.ELit Extraction.LitNull); | ||
10 | ("seq", `Nonrec, mn_abs [ "e1"; "e2" ] (mn_seq (mn_id "e1") (mn_id "e2"))); | ||
11 | ( "deepSeq", | ||
12 | `Nonrec, | ||
13 | mn_abs [ "e1"; "e2" ] (mn_deep_seq (mn_id "e1") (mn_id "e2")) ); | ||
14 | ("typeOf", `Nonrec, mn_abs [ "e" ] (mn_type_of (mn_id "e"))); | ||
15 | ("functionArgs", `Nonrec, mn_abs [ "f" ] (mn_function_args (mn_id "f"))); | ||
16 | ( "bitAnd", | ||
17 | `Nonrec, | ||
18 | mn_abs [ "x"; "y" ] (mn_bit_and (mn_id "x") (mn_id "y")) ); | ||
19 | ("bitOr", `Nonrec, mn_abs [ "x"; "y" ] (mn_bit_or (mn_id "x") (mn_id "y"))); | ||
20 | ( "bitXor", | ||
21 | `Nonrec, | ||
22 | mn_abs [ "x"; "y" ] (mn_bit_xor (mn_id "x") (mn_id "y")) ); | ||
23 | ("ceil", `Nonrec, mn_abs [ "x" ] (mn_ceil (mn_id "x"))); | ||
24 | ("floor", `Nonrec, mn_abs [ "x" ] (mn_floor (mn_id "x"))); | ||
25 | ("__mn_nearestEven", `Nonrec, mn_abs [ "x" ] (mn_nearest_even (mn_id "x"))); | ||
26 | ( "__mn_singleton", | ||
27 | `Nonrec, | ||
28 | mn_abs [ "x"; "e" ] (mn_singleton_attr (mn_id "x") (mn_id "e")) ); | ||
29 | ( "__mn_attr_delete", | ||
30 | `Nonrec, | ||
31 | mn_abs [ "as"; "x" ] (mn_delete_attr (mn_id "as") (mn_id "x")) ); | ||
32 | ( "__mn_attr_has_prim", | ||
33 | `Nonrec, | ||
34 | mn_abs [ "d"; "e" ] (mn_has_attr (mn_id "d") (mn_id "e")) ); | ||
35 | ("__mn_attr_match", `Nonrec, mn_abs [ "as" ] (mn_attr_match (mn_id "as"))); | ||
36 | ("__mn_list_match", `Nonrec, mn_abs [ "xs" ] (mn_list_match (mn_id "xs"))); | ||
37 | ( "__mn_string_match", | ||
38 | `Nonrec, | ||
39 | mn_abs [ "s" ] (mn_string_match (mn_id "s")) ); | ||
40 | ] | ||
41 | |||
42 | (* Watch out to not introduce constructs here that refer to themselves using | ||
43 | the mnbi_* functions in Nix2mininix - this can cause undesired loops. *) | ||
44 | let builtins_nix = | ||
45 | Nix.elaborate (Nix.parse ~filename:"<builtins>" [%blob "builtins.nix"]) | ||
46 | |||
47 | let builtins = | ||
48 | Extraction.ELetAttr | ||
49 | (Extraction.ABS, minimal_prelude, Nix2mininix.from_nix builtins_nix) | ||
50 | |||
51 | let exported_builtins = | ||
52 | [ | ||
53 | "__mn_assert"; | ||
54 | "__mn_attr_has"; | ||
55 | "__mn_attr_insertNew"; | ||
56 | "__mn_attr_select"; | ||
57 | "__mn_attr_selectOr"; | ||
58 | "abort"; | ||
59 | "false"; | ||
60 | "head"; | ||
61 | "map"; | ||
62 | "null"; | ||
63 | "removeAttrs"; | ||
64 | "tail"; | ||
65 | "throw"; | ||
66 | "toString"; | ||
67 | "true"; | ||
68 | ] | ||
69 | |||
70 | let apply_prelude e = | ||
71 | let bindings = | ||
72 | mn_attr | ||
73 | (("builtins", `Nonrec, builtins) | ||
74 | :: List.map exported_builtins ~f:(fun x -> | ||
75 | (x, `Rec, mn_select_attr (mn_id "builtins") (mn_str x)))) | ||
76 | in | ||
77 | Extraction.ELetAttr (Extraction.ABS, bindings, e) | ||