diff options
Diffstat (limited to 'lib/mininix/mininix2nix.ml')
-rw-r--r-- | lib/mininix/mininix2nix.ml | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/lib/mininix/mininix2nix.ml b/lib/mininix/mininix2nix.ml new file mode 100644 index 0000000..efbc42a --- /dev/null +++ b/lib/mininix/mininix2nix.ml | |||
@@ -0,0 +1,54 @@ | |||
1 | open Conv | ||
2 | open Core | ||
3 | |||
4 | (* [or] is not a 'strong' keyword. That means that 'it depends' whether it is | ||
5 | identified as such. In the context of the left-hand side of an attribute, it | ||
6 | is not recognized as such. *) | ||
7 | let strong_keywords = | ||
8 | [ "with"; "rec"; "let"; "in"; "inherit"; "if"; "then"; "else"; "assert" ] | ||
9 | |||
10 | let id_re = Str.regexp {|^[A-Za-z_]+[A-Za-z0-9'_-]*$|} | ||
11 | |||
12 | let is_simple_id s = | ||
13 | Str.string_match id_re s 0 | ||
14 | && not (List.exists strong_keywords ~f:(String.( = ) s)) | ||
15 | |||
16 | let thunk_map_to_map tm = | ||
17 | Extraction.thunk_map_fold | ||
18 | (fun k t -> Map.add_exn ~key:(String.of_char_list k) ~data:t) | ||
19 | (Map.empty (module String)) | ||
20 | tm | ||
21 | |||
22 | let from_lit l = | ||
23 | match l with | ||
24 | | Extraction.LitString s -> Nix.Ast.Val (Nix.Ast.Str (str s, [])) | ||
25 | | Extraction.LitNull -> Nix.Ast.Id "null" | ||
26 | | Extraction.LitBool b -> Nix.Ast.Id (if b then "true" else "false") | ||
27 | | Extraction.LitNum x -> | ||
28 | Nix.Ast.Val | ||
29 | (match x with | ||
30 | | Extraction.NInt x -> Nix.Ast.Int (x |> Extraction.string_of_Z |> str) | ||
31 | | Extraction.NFloat x -> | ||
32 | Nix.Ast.Float (Printf.sprintf "%g" (float_from_flocq x))) | ||
33 | |||
34 | let rec from_val = function | ||
35 | | Extraction.VClo _ | Extraction.VCloMatch _ -> Nix.Ast.Id "<CODE>" | ||
36 | | Extraction.VLit l -> from_lit l | ||
37 | | Extraction.VAttr bs -> | ||
38 | let bs = | ||
39 | thunk_map_to_map bs | ||
40 | |> Map.to_alist ~key_order:`Increasing | ||
41 | |> List.map ~f:(fun (x, t) -> | ||
42 | let lhs = | ||
43 | if is_simple_id x then Nix.Ast.Id x | ||
44 | else Nix.Ast.Val (Nix.Ast.Str (x, [])) | ||
45 | in | ||
46 | Nix.Ast.AttrPath ([ lhs ], from_thunk t)) | ||
47 | in | ||
48 | Nix.Ast.Val (Nix.Ast.AttSet (Nix.Ast.Nonrec, bs)) | ||
49 | | Extraction.VList ts -> Nix.Ast.Val (Nix.Ast.List List.(ts >>| from_thunk)) | ||
50 | |||
51 | and from_thunk = function | ||
52 | | Extraction.Thunk (_, ELit l) -> from_lit l | ||
53 | | Extraction.Thunk _ | Extraction.Indirect _ -> Nix.Ast.Id "<CODE>" | ||
54 | | Extraction.Forced v -> from_val v | ||