- evaluate_target env expr
-
- (* Lists are inlined when found as a target. *)
- | Ast.EList (loc, exprs) ->
- evaluate_targets env exprs
-
- (* A string (with or without substitutions) implies *file(filename). *)
- | Ast.ESubsts (loc, str) ->
- let str = Ast.substitute env loc str in
- run_tactic env loc "file" [Ast.CString str]
-
- | Ast.EConstant (loc, c) ->
- run_tactic env loc "file" [c]
-
-(* Run a goal by name. *)
-and run_goal env loc name args (params, patterns, deps, code) =
- (* Create a new environment which maps the parameter names to
- * the args.
- *)
- let env =
- let params =
- try List.combine params args
- with Invalid_argument _ ->
- failwithf "%a: calling goal ‘%s’ with wrong number of arguments"
- Ast.string_loc loc name in
- List.fold_left (fun env (k, v) -> Ast.Env.add k v env) env params in
-
- (* Check all dependencies have been updated. *)
- evaluate_targets env deps;
-
- (* Check if any target (ie. pattern) needs to be rebuilt. *)
- let rebuild =
- List.exists (needs_rebuild env loc name deps) patterns in
-
- if rebuild then (
- (* Run the code (if any). *)
- (match code with
- | None -> ()
- | Some code ->
- let code = Ast.substitute env loc code in
- Printf.printf "running : %s\n" code
- );
-
- (* Check all targets were updated (else it's an error). *)
- let pattern_still_needs_rebuild =
- try Some (List.find (needs_rebuild env loc name deps) patterns)
- with Not_found -> None in
- match pattern_still_needs_rebuild with
- | None -> ()
- | Some pattern ->
- failwithf "%a: goal ‘%s’ ran successfully but it did not rebuild %a"
- Ast.string_loc loc
- name
- Ast.string_pattern pattern
- )
+ to_constant env expr
+
+ | ESubsts (loc, str) ->
+ CString (substitute env loc str)
+
+ | EList (loc, _) ->
+ failwithf "%a: list found where constant expression expected"
+ Ast.string_loc loc
+
+ | ECallGoal (loc, name, _) ->
+ failwithf "%a: cannot use goal ‘%s’ in constant expression"
+ Ast.string_loc loc name
+
+ | ETacticCtor (loc, name, _) ->
+ failwithf "%a: cannot use tactic ‘%s’ in constant expression"
+ Ast.string_loc loc name
+
+ | EGoalDefn (loc, _) ->
+ failwithf "%a: cannot use goal in constant expression"
+ Ast.string_loc loc
+
+ | ETacticDefn (loc, _) ->
+ failwithf "%a: cannot use tactic in constant expression"
+ Ast.string_loc loc
+
+and substitute env loc substs =
+ let b = Buffer.create 13 in
+ List.iter (
+ function
+ | Ast.SString s -> Buffer.add_string b s
+ | SVar name ->
+ let expr = Ast.getvar env loc name in
+ match to_constant env expr with
+ | Ast.CString s -> Buffer.add_string b s
+ ) substs;
+ Buffer.contents b
+
+let rec to_shell_script env loc substs =
+ let b = Buffer.create 13 in
+ List.iter (
+ function
+ | Ast.SString s -> Buffer.add_string b s
+ | SVar name ->
+ let expr = Ast.getvar env loc name in
+ let s = expr_to_shell_string env expr in
+ Buffer.add_string b s
+ ) substs;
+ Buffer.contents b
+
+and expr_to_shell_string env = function
+ | Ast.EConstant (loc, CString s) -> Filename.quote s
+
+ | EVar (loc, name) ->
+ let expr = Ast.getvar env loc name in
+ expr_to_shell_string env expr