diff options
author | Rutger Broekhoff | 2025-07-07 21:52:08 +0200 |
---|---|---|
committer | Rutger Broekhoff | 2025-07-07 21:52:08 +0200 |
commit | ba61dfd69504ec6263a9dee9931d93adeb6f3142 (patch) | |
tree | d6c9b78e50eeab24e0c1c09ab45909a6ae3fd5db /lib/mininix/import.ml | |
download | verified-dyn-lang-interp-ba61dfd69504ec6263a9dee9931d93adeb6f3142.tar.gz verified-dyn-lang-interp-ba61dfd69504ec6263a9dee9931d93adeb6f3142.zip |
Initialize repository
Diffstat (limited to 'lib/mininix/import.ml')
-rw-r--r-- | lib/mininix/import.ml | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/lib/mininix/import.ml b/lib/mininix/import.ml new file mode 100644 index 0000000..ca1bfb5 --- /dev/null +++ b/lib/mininix/import.ml | |||
@@ -0,0 +1,54 @@ | |||
1 | open Core | ||
2 | |||
3 | exception ImportError of string | ||
4 | |||
5 | type tree = { filename : string; deps : forest } | ||
6 | and forest = tree list | ||
7 | |||
8 | let provide (imports : (string * Extraction.coq_val) list) = | ||
9 | let imports_set = | ||
10 | Extraction.( | ||
11 | VAttr | ||
12 | (List.fold imports ~init:thunk_map_empty ~f:(fun attrs (filename, v) -> | ||
13 | thunk_map_insert (Conv.chlist filename) (Forced v) attrs))) | ||
14 | in | ||
15 | let make_env = | ||
16 | Extraction.( | ||
17 | env_insert_abs (Conv.chlist "imports") (Forced imports_set) env_empty) | ||
18 | in | ||
19 | Extraction.( | ||
20 | VClo | ||
21 | ( Conv.chlist "path", | ||
22 | make_env, | ||
23 | EBinOp | ||
24 | ( SelectAttrOp, | ||
25 | EId (Conv.chlist "imports", None), | ||
26 | EId (Conv.chlist "path", None) ) )) | ||
27 | |||
28 | let make_env (imports : (string * Extraction.coq_val) list) = | ||
29 | Extraction.( | ||
30 | env_insert_abs (Conv.chlist "import") (Forced (provide imports)) env_empty) | ||
31 | |||
32 | let rec import trees : (string * Extraction.coq_val) list = | ||
33 | List.map trees ~f:(fun { filename; deps } -> | ||
34 | let data = In_channel.read_all filename in | ||
35 | Nix.parse ~filename data |> Nix.elaborate |> Nix2mininix.from_nix | ||
36 | |> Builtins.apply_prelude | ||
37 | |> Run.interp ~fuel:`Unlimited ~mode:`Shallow | ||
38 | ~env:(make_env (import deps)) | ||
39 | |> function | ||
40 | | Res (Some v) -> (filename, v) | ||
41 | | Res None -> | ||
42 | raise | ||
43 | (ImportError | ||
44 | (sprintf "Could not import %s: Failed to evaluate" filename)) | ||
45 | | NoFuel -> assert false) | ||
46 | |||
47 | let rec tree_map ~(f : string -> string) { filename; deps } = | ||
48 | { filename = f filename; deps = forest_map ~f deps } | ||
49 | |||
50 | and forest_map ~(f : string -> string) trees = List.map ~f:(tree_map ~f) trees | ||
51 | |||
52 | (* [relative_to] must be an absolute path *) | ||
53 | let materialize forest ~relative_to : (string * Extraction.coq_val) list = | ||
54 | forest_map forest ~f:(Filename.to_absolute_exn ~relative_to) |> import | ||