(* ========================================================================== *)
(* FLYSPECK - BOOK FORMALIZATION *)
(* *)
(* HOL LIGHT pervasives *)
(* Author: Thomas C. Hales *)
(* Date: 2012-04-15 *)
(* ========================================================================== *)
(* This file contains Ocaml library functions *)
module Flyspeck_lib = struct
(*
eval_command comes from
http://solaria.dimino.org/cgi-bin/darcsweb.cgi?r=peps;a=headblob;f=/src/core/peps_top.ml
License: BSD3
If the expression is syntactically correct
and the evaluation raises an exception, then the return value is true.
*)
let eval_command ?(silent=false) command =
let buffer = Buffer.create 512 in
let pp = Format.formatter_of_buffer buffer in
Format.pp_set_margin pp max_int;
try
let _ =
Toploop.execute_phrase (not silent) pp
(!Toploop.parse_toplevel_phrase (Lexing.from_string (command ^ ";;")))
in
(true, Buffer.contents buffer)
with exn ->
let save = !Toploop.parse_use_file in
Toploop.parse_use_file := (fun _ -> raise exn);
Pervasives.ignore (Toploop.use_silently pp "/dev/null");
Toploop.parse_use_file := save;
(false, Buffer.contents buffer);;
(* eval_command ~silent:false "g `x=y`";; *)
(* process_to_string in strictbuild.hl *)
let svn_version() = "svn("^
(process_to_string ("svnversion -n " ^ flyspeck_dir))^
","^
(process_to_string("svnversion -n " ^ hollight_dir))^
")";;
(* duplicated code *)
let unsplit d f = function
| (x::xs) -> List.fold_left (fun s t -> s^d^(f t)) (f x) xs
| [] -> "";;
let join_comma = unsplit "," (fun x-> x);;
let join_lines = unsplit "\n" (fun x-> x);;
let join_space = unsplit " " (fun x-> x);;
let rec nub = function (* from lpproc.ml *)
| [] -> []
| x::xs -> x::filter ((<>) x) (nub xs);;
(* duplicated code *)
(* System commands *)
let output_filestring tmpfile a =
let outs = open_out tmpfile in
let _ = try (Printf.fprintf outs "%s" a)
with _ as t -> (close_out outs; raise t) in
close_out outs ;;
(* from glpk_link.ml *)
let load_and_close_channel do_close ic =
let rec lf ichan a =
try
lf ic (Pervasives.input_line ic::a)
with End_of_file -> a in
let rs = lf ic [] in
if do_close then Pervasives.close_in ic else ();
rev rs;;
let load_and_close_channel_true ic =
let rec lf ichan a =
try
lf ic (Pervasives.input_line ic::a)
with End_of_file -> a | _ as t -> (Pervasives.close_in ic; raise t) in
let rs = lf ic [] in
let _ = Pervasives.close_in ic in
rev rs;;
let load_file filename =
let ic = Pervasives.open_in filename in load_and_close_channel_true ic;;
(* deprecated
let print_string_as_text = report;;
*)
let exists_pgm s =
let com = "command -v " ^ s in
not(process_to_string com = "");;
(* numerical *)
let dest_decimal x = match strip_comb x with
| (dec,[a;b]) ->
div_num (dest_numeral a) (dest_numeral b)
| _ -> failwith ("dest_decimal: '" ^ string_of_term x ^ "'") ;;
let string_of_num' x = string_of_float (float_of_num x);;
end;;