| author | wenzelm | 
| Thu, 02 Aug 2012 15:23:28 +0200 | |
| changeset 48649 | bf9bff84a61d | 
| parent 46959 | cdc791910460 | 
| child 48867 | e9beabf045ab | 
| permissions | -rw-r--r-- | 
| 6168 | 1 | (* Title: Pure/Thy/thy_load.ML | 
| 42002 | 2 | Author: Makarius | 
| 6168 | 3 | |
| 42002 | 4 | Loading files that contribute to a theory. Global master path. | 
| 6168 | 5 | *) | 
| 6 | ||
| 7 | signature THY_LOAD = | |
| 8 | sig | |
| 37949 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 9 | val master_directory: theory -> Path.T | 
| 41548 
bd0bebf93fa6
Thy_Load.begin_theory: maintain source specification of imports;
 wenzelm parents: 
41414diff
changeset | 10 | val imports_of: theory -> string list | 
| 41955 
703ea96b13c6
files are identified via SHA1 digests -- discontinued ISABELLE_FILE_IDENT;
 wenzelm parents: 
41944diff
changeset | 11 | val provide: Path.T * (Path.T * SHA1.digest) -> theory -> theory | 
| 42003 
6e45dc518ebb
replaced File.check by specific File.check_file, File.check_dir;
 wenzelm parents: 
42002diff
changeset | 12 | val check_file: Path.T -> Path.T -> Path.T | 
| 46737 | 13 | val thy_path: Path.T -> Path.T | 
| 42003 
6e45dc518ebb
replaced File.check by specific File.check_file, File.check_dir;
 wenzelm parents: 
42002diff
changeset | 14 | val check_thy: Path.T -> string -> | 
| 
6e45dc518ebb
replaced File.check by specific File.check_file, File.check_dir;
 wenzelm parents: 
42002diff
changeset | 15 |     {master: Path.T * SHA1.digest, text: string, imports: string list, uses: (Path.T * bool) list}
 | 
| 43702 
24fb44c1086a
more abstract Thy_Load.load_file/use_file for external theory resources;
 wenzelm parents: 
43700diff
changeset | 16 | val load_file: theory -> Path.T -> (Path.T * SHA1.digest) * string | 
| 
24fb44c1086a
more abstract Thy_Load.load_file/use_file for external theory resources;
 wenzelm parents: 
43700diff
changeset | 17 | val use_file: Path.T -> theory -> string * theory | 
| 37949 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 18 | val loaded_files: theory -> Path.T list | 
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 19 | val all_current: theory -> bool | 
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 20 | val use_ml: Path.T -> unit | 
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 21 | val exec_ml: Path.T -> generic_theory -> generic_theory | 
| 46938 
cda018294515
some support for outer syntax keyword declarations within theory header;
 wenzelm parents: 
46811diff
changeset | 22 | val begin_theory: Path.T -> Thy_Header.header -> theory list -> theory | 
| 
cda018294515
some support for outer syntax keyword declarations within theory header;
 wenzelm parents: 
46811diff
changeset | 23 | val load_thy: int -> Path.T -> Thy_Header.header -> Position.T -> string -> | 
| 
cda018294515
some support for outer syntax keyword declarations within theory header;
 wenzelm parents: 
46811diff
changeset | 24 | theory list -> theory * unit future | 
| 42002 | 25 | val set_master_path: Path.T -> unit | 
| 26 | val get_master_path: unit -> Path.T | |
| 6168 | 27 | end; | 
| 28 | ||
| 37216 
3165bc303f66
modernized some structure names, keeping a few legacy aliases;
 wenzelm parents: 
33221diff
changeset | 29 | structure Thy_Load: THY_LOAD = | 
| 6168 | 30 | struct | 
| 31 | ||
| 37949 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 32 | (* manage source files *) | 
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 33 | |
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 34 | type files = | 
| 40741 
17d6293a1e26
moved file identification to thy_load.ML (where it is actually used);
 wenzelm parents: 
40625diff
changeset | 35 |  {master_dir: Path.T,  (*master directory of theory source*)
 | 
| 41548 
bd0bebf93fa6
Thy_Load.begin_theory: maintain source specification of imports;
 wenzelm parents: 
41414diff
changeset | 36 | imports: string list, (*source specification of imports*) | 
| 40741 
17d6293a1e26
moved file identification to thy_load.ML (where it is actually used);
 wenzelm parents: 
40625diff
changeset | 37 | required: Path.T list, (*source path*) | 
| 41955 
703ea96b13c6
files are identified via SHA1 digests -- discontinued ISABELLE_FILE_IDENT;
 wenzelm parents: 
41944diff
changeset | 38 | provided: (Path.T * (Path.T * SHA1.digest)) list}; (*source path, physical path, digest*) | 
| 37949 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 39 | |
| 41548 
bd0bebf93fa6
Thy_Load.begin_theory: maintain source specification of imports;
 wenzelm parents: 
41414diff
changeset | 40 | fun make_files (master_dir, imports, required, provided): files = | 
| 
bd0bebf93fa6
Thy_Load.begin_theory: maintain source specification of imports;
 wenzelm parents: 
41414diff
changeset | 41 |  {master_dir = master_dir, imports = imports, required = required, provided = provided};
 | 
| 37949 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 42 | |
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 43 | structure Files = Theory_Data | 
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 44 | ( | 
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 45 | type T = files; | 
| 41548 
bd0bebf93fa6
Thy_Load.begin_theory: maintain source specification of imports;
 wenzelm parents: 
41414diff
changeset | 46 | val empty = make_files (Path.current, [], [], []); | 
| 37949 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 47 | fun extend _ = empty; | 
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 48 | fun merge _ = empty; | 
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 49 | ); | 
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 50 | |
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 51 | fun map_files f = | 
| 41548 
bd0bebf93fa6
Thy_Load.begin_theory: maintain source specification of imports;
 wenzelm parents: 
41414diff
changeset | 52 |   Files.map (fn {master_dir, imports, required, provided} =>
 | 
| 
bd0bebf93fa6
Thy_Load.begin_theory: maintain source specification of imports;
 wenzelm parents: 
41414diff
changeset | 53 | make_files (f (master_dir, imports, required, provided))); | 
| 37949 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 54 | |
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 55 | |
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 56 | val master_directory = #master_dir o Files.get; | 
| 41548 
bd0bebf93fa6
Thy_Load.begin_theory: maintain source specification of imports;
 wenzelm parents: 
41414diff
changeset | 57 | val imports_of = #imports o Files.get; | 
| 37949 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 58 | |
| 41548 
bd0bebf93fa6
Thy_Load.begin_theory: maintain source specification of imports;
 wenzelm parents: 
41414diff
changeset | 59 | fun put_deps dir imports = map_files (fn _ => (dir, imports, [], [])); | 
| 37949 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 60 | |
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 61 | fun require src_path = | 
| 41548 
bd0bebf93fa6
Thy_Load.begin_theory: maintain source specification of imports;
 wenzelm parents: 
41414diff
changeset | 62 | map_files (fn (master_dir, imports, required, provided) => | 
| 37949 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 63 | if member (op =) required src_path then | 
| 41944 
b97091ae583a
Path.print is the official way to show file-system paths to users -- note that Path.implode often indicates violation of the abstract datatype;
 wenzelm parents: 
41886diff
changeset | 64 |       error ("Duplicate source file dependency: " ^ Path.print src_path)
 | 
| 41548 
bd0bebf93fa6
Thy_Load.begin_theory: maintain source specification of imports;
 wenzelm parents: 
41414diff
changeset | 65 | else (master_dir, imports, src_path :: required, provided)); | 
| 37949 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 66 | |
| 37978 
548f3f165d05
simplified Thy_Header.read -- include Source.of_string_limited here;
 wenzelm parents: 
37977diff
changeset | 67 | fun provide (src_path, path_id) = | 
| 41548 
bd0bebf93fa6
Thy_Load.begin_theory: maintain source specification of imports;
 wenzelm parents: 
41414diff
changeset | 68 | map_files (fn (master_dir, imports, required, provided) => | 
| 37949 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 69 | if AList.defined (op =) provided src_path then | 
| 41944 
b97091ae583a
Path.print is the official way to show file-system paths to users -- note that Path.implode often indicates violation of the abstract datatype;
 wenzelm parents: 
41886diff
changeset | 70 |       error ("Duplicate resolution of source file dependency: " ^ Path.print src_path)
 | 
| 41548 
bd0bebf93fa6
Thy_Load.begin_theory: maintain source specification of imports;
 wenzelm parents: 
41414diff
changeset | 71 | else (master_dir, imports, required, (src_path, path_id) :: provided)); | 
| 37949 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 72 | |
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 73 | |
| 23872 | 74 | (* check files *) | 
| 6232 | 75 | |
| 42003 
6e45dc518ebb
replaced File.check by specific File.check_file, File.check_dir;
 wenzelm parents: 
42002diff
changeset | 76 | fun check_file dir file = File.check_file (File.full_path dir file); | 
| 
6e45dc518ebb
replaced File.check by specific File.check_file, File.check_dir;
 wenzelm parents: 
42002diff
changeset | 77 | |
| 46737 | 78 | val thy_path = Path.ext "thy"; | 
| 79 | ||
| 41886 | 80 | fun check_thy dir name = | 
| 23872 | 81 | let | 
| 46737 | 82 | val path = thy_path (Path.basic name); | 
| 83 | val master_file = check_file dir path; | |
| 42003 
6e45dc518ebb
replaced File.check by specific File.check_file, File.check_dir;
 wenzelm parents: 
42002diff
changeset | 84 | val text = File.read master_file; | 
| 
6e45dc518ebb
replaced File.check by specific File.check_file, File.check_dir;
 wenzelm parents: 
42002diff
changeset | 85 | val (name', imports, uses) = | 
| 
6e45dc518ebb
replaced File.check by specific File.check_file, File.check_dir;
 wenzelm parents: 
42002diff
changeset | 86 | if name = Context.PureN then (Context.PureN, [], []) | 
| 46938 
cda018294515
some support for outer syntax keyword declarations within theory header;
 wenzelm parents: 
46811diff
changeset | 87 | else | 
| 
cda018294515
some support for outer syntax keyword declarations within theory header;
 wenzelm parents: 
46811diff
changeset | 88 |         let val {name, imports, uses, ...} = Thy_Header.read (Path.position master_file) text
 | 
| 
cda018294515
some support for outer syntax keyword declarations within theory header;
 wenzelm parents: 
46811diff
changeset | 89 | in (name, imports, uses) end; | 
| 46737 | 90 | val _ = name <> name' andalso | 
| 91 |       error ("Bad file name " ^ Path.print path ^ " for theory " ^ quote name');
 | |
| 42003 
6e45dc518ebb
replaced File.check by specific File.check_file, File.check_dir;
 wenzelm parents: 
42002diff
changeset | 92 |   in {master = (master_file, SHA1.digest text), text = text, imports = imports, uses = uses} end;
 | 
| 6168 | 93 | |
| 37949 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 94 | |
| 43702 
24fb44c1086a
more abstract Thy_Load.load_file/use_file for external theory resources;
 wenzelm parents: 
43700diff
changeset | 95 | (* load files *) | 
| 
24fb44c1086a
more abstract Thy_Load.load_file/use_file for external theory resources;
 wenzelm parents: 
43700diff
changeset | 96 | |
| 
24fb44c1086a
more abstract Thy_Load.load_file/use_file for external theory resources;
 wenzelm parents: 
43700diff
changeset | 97 | fun load_file thy src_path = | 
| 
24fb44c1086a
more abstract Thy_Load.load_file/use_file for external theory resources;
 wenzelm parents: 
43700diff
changeset | 98 | let | 
| 
24fb44c1086a
more abstract Thy_Load.load_file/use_file for external theory resources;
 wenzelm parents: 
43700diff
changeset | 99 | val full_path = check_file (master_directory thy) src_path; | 
| 
24fb44c1086a
more abstract Thy_Load.load_file/use_file for external theory resources;
 wenzelm parents: 
43700diff
changeset | 100 | val text = File.read full_path; | 
| 
24fb44c1086a
more abstract Thy_Load.load_file/use_file for external theory resources;
 wenzelm parents: 
43700diff
changeset | 101 | val id = SHA1.digest text; | 
| 
24fb44c1086a
more abstract Thy_Load.load_file/use_file for external theory resources;
 wenzelm parents: 
43700diff
changeset | 102 | in ((full_path, id), text) end; | 
| 
24fb44c1086a
more abstract Thy_Load.load_file/use_file for external theory resources;
 wenzelm parents: 
43700diff
changeset | 103 | |
| 
24fb44c1086a
more abstract Thy_Load.load_file/use_file for external theory resources;
 wenzelm parents: 
43700diff
changeset | 104 | fun use_file src_path thy = | 
| 
24fb44c1086a
more abstract Thy_Load.load_file/use_file for external theory resources;
 wenzelm parents: 
43700diff
changeset | 105 | let | 
| 
24fb44c1086a
more abstract Thy_Load.load_file/use_file for external theory resources;
 wenzelm parents: 
43700diff
changeset | 106 | val (path_id, text) = load_file thy src_path; | 
| 
24fb44c1086a
more abstract Thy_Load.load_file/use_file for external theory resources;
 wenzelm parents: 
43700diff
changeset | 107 | val thy' = provide (src_path, path_id) thy; | 
| 
24fb44c1086a
more abstract Thy_Load.load_file/use_file for external theory resources;
 wenzelm parents: 
43700diff
changeset | 108 | in (text, thy') end; | 
| 37949 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 109 | |
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 110 | val loaded_files = map (#1 o #2) o #provided o Files.get; | 
| 6168 | 111 | |
| 37949 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 112 | fun check_loaded thy = | 
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 113 | let | 
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 114 |     val {required, provided, ...} = Files.get thy;
 | 
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 115 | val provided_paths = map #1 provided; | 
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 116 | val _ = | 
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 117 | (case subtract (op =) provided_paths required of | 
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 118 | [] => NONE | 
| 41944 
b97091ae583a
Path.print is the official way to show file-system paths to users -- note that Path.implode often indicates violation of the abstract datatype;
 wenzelm parents: 
41886diff
changeset | 119 |       | bad => error ("Pending source file dependencies: " ^ commas (map Path.print (rev bad))));
 | 
| 37949 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 120 | val _ = | 
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 121 | (case subtract (op =) required provided_paths of | 
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 122 | [] => NONE | 
| 41944 
b97091ae583a
Path.print is the official way to show file-system paths to users -- note that Path.implode often indicates violation of the abstract datatype;
 wenzelm parents: 
41886diff
changeset | 123 |       | bad => error ("Undeclared source file dependencies: " ^ commas (map Path.print (rev bad))));
 | 
| 37949 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 124 | in () end; | 
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 125 | |
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 126 | fun all_current thy = | 
| 37939 
965537d86fcc
discontinued special treatment of ML files -- no longer complete extensions on demand;
 wenzelm parents: 
37938diff
changeset | 127 | let | 
| 43702 
24fb44c1086a
more abstract Thy_Load.load_file/use_file for external theory resources;
 wenzelm parents: 
43700diff
changeset | 128 |     val {provided, ...} = Files.get thy;
 | 
| 37978 
548f3f165d05
simplified Thy_Header.read -- include Source.of_string_limited here;
 wenzelm parents: 
37977diff
changeset | 129 | fun current (src_path, (_, id)) = | 
| 43702 
24fb44c1086a
more abstract Thy_Load.load_file/use_file for external theory resources;
 wenzelm parents: 
43700diff
changeset | 130 | (case try (load_file thy) src_path of | 
| 37949 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 131 | NONE => false | 
| 43702 
24fb44c1086a
more abstract Thy_Load.load_file/use_file for external theory resources;
 wenzelm parents: 
43700diff
changeset | 132 | | SOME ((_, id'), _) => id = id'); | 
| 37949 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 133 | in can check_loaded thy andalso forall current provided end; | 
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 134 | |
| 37952 | 135 | val _ = Context.>> (Context.map_theory (Theory.at_end (fn thy => (check_loaded thy; NONE)))); | 
| 136 | ||
| 37949 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 137 | |
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 138 | (* provide files *) | 
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 139 | |
| 43700 
e4ece46a9ca7
clarified Thy_Load.digest_file -- read ML files only once;
 wenzelm parents: 
42003diff
changeset | 140 | fun eval_file path text = ML_Context.eval_text true (Path.position path) text; | 
| 37949 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 141 | |
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 142 | fun use_ml src_path = | 
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 143 | if is_none (Context.thread_data ()) then | 
| 43700 
e4ece46a9ca7
clarified Thy_Load.digest_file -- read ML files only once;
 wenzelm parents: 
42003diff
changeset | 144 | let val path = check_file Path.current src_path | 
| 
e4ece46a9ca7
clarified Thy_Load.digest_file -- read ML files only once;
 wenzelm parents: 
42003diff
changeset | 145 | in eval_file path (File.read path) end | 
| 37949 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 146 | else | 
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 147 | let | 
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 148 | val thy = ML_Context.the_global_context (); | 
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 149 | |
| 43702 
24fb44c1086a
more abstract Thy_Load.load_file/use_file for external theory resources;
 wenzelm parents: 
43700diff
changeset | 150 | val ((path, id), text) = load_file thy src_path; | 
| 43700 
e4ece46a9ca7
clarified Thy_Load.digest_file -- read ML files only once;
 wenzelm parents: 
42003diff
changeset | 151 | val _ = eval_file path text; | 
| 37949 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 152 | val _ = Context.>> Local_Theory.propagate_ml_env; | 
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 153 | |
| 37978 
548f3f165d05
simplified Thy_Header.read -- include Source.of_string_limited here;
 wenzelm parents: 
37977diff
changeset | 154 | val provide = provide (src_path, (path, id)); | 
| 38757 
2b3e054ae6fc
renamed Local_Theory.theory(_result) to Local_Theory.background_theory(_result) to emphasize that this belongs to the infrastructure and is rarely appropriate in user-space tools;
 wenzelm parents: 
38133diff
changeset | 155 | val _ = Context.>> (Context.mapping provide (Local_Theory.background_theory provide)); | 
| 37978 
548f3f165d05
simplified Thy_Header.read -- include Source.of_string_limited here;
 wenzelm parents: 
37977diff
changeset | 156 | in () end; | 
| 37949 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 157 | |
| 
48a874444164
moved management of auxiliary theory source files to Thy_Load -- as theory data instead of accidental loader state;
 wenzelm parents: 
37943diff
changeset | 158 | fun exec_ml src_path = ML_Context.exec (fn () => use_ml src_path); | 
| 6168 | 159 | |
| 37977 
3ceccd415145
simplified/clarified theory loader: more explicit task management, kill old versions at start, commit results only in the very end, non-optional master dependency, do not store text in deps;
 wenzelm parents: 
37952diff
changeset | 160 | |
| 43712 
3c2c912af2ef
moved Outer_Syntax.load_thy to Thy_Load.load_thy;
 wenzelm parents: 
43702diff
changeset | 161 | (* load_thy *) | 
| 37977 
3ceccd415145
simplified/clarified theory loader: more explicit task management, kill old versions at start, commit results only in the very end, non-optional master dependency, do not store text in deps;
 wenzelm parents: 
37952diff
changeset | 162 | |
| 46938 
cda018294515
some support for outer syntax keyword declarations within theory header;
 wenzelm parents: 
46811diff
changeset | 163 | fun begin_theory dir {name, imports, keywords, uses} parents =
 | 
| 37977 
3ceccd415145
simplified/clarified theory loader: more explicit task management, kill old versions at start, commit results only in the very end, non-optional master dependency, do not store text in deps;
 wenzelm parents: 
37952diff
changeset | 164 | Theory.begin_theory name parents | 
| 41548 
bd0bebf93fa6
Thy_Load.begin_theory: maintain source specification of imports;
 wenzelm parents: 
41414diff
changeset | 165 | |> put_deps dir imports | 
| 46938 
cda018294515
some support for outer syntax keyword declarations within theory header;
 wenzelm parents: 
46811diff
changeset | 166 | |> fold Thy_Header.declare_keyword keywords | 
| 37977 
3ceccd415145
simplified/clarified theory loader: more explicit task management, kill old versions at start, commit results only in the very end, non-optional master dependency, do not store text in deps;
 wenzelm parents: 
37952diff
changeset | 167 | |> fold (require o fst) uses | 
| 
3ceccd415145
simplified/clarified theory loader: more explicit task management, kill old versions at start, commit results only in the very end, non-optional master dependency, do not store text in deps;
 wenzelm parents: 
37952diff
changeset | 168 | |> fold (fn (path, true) => Context.theory_map (exec_ml path) o Theory.checkpoint | _ => I) uses | 
| 
3ceccd415145
simplified/clarified theory loader: more explicit task management, kill old versions at start, commit results only in the very end, non-optional master dependency, do not store text in deps;
 wenzelm parents: 
37952diff
changeset | 169 | |> Theory.checkpoint; | 
| 
3ceccd415145
simplified/clarified theory loader: more explicit task management, kill old versions at start, commit results only in the very end, non-optional master dependency, do not store text in deps;
 wenzelm parents: 
37952diff
changeset | 170 | |
| 46959 
cdc791910460
defer actual parsing of command spans and thus allow new commands to be used in the same theory where defined;
 wenzelm parents: 
46958diff
changeset | 171 | fun excursion init elements = | 
| 
cdc791910460
defer actual parsing of command spans and thus allow new commands to be used in the same theory where defined;
 wenzelm parents: 
46958diff
changeset | 172 | let | 
| 
cdc791910460
defer actual parsing of command spans and thus allow new commands to be used in the same theory where defined;
 wenzelm parents: 
46958diff
changeset | 173 | val immediate = not (Goal.future_enabled ()); | 
| 
cdc791910460
defer actual parsing of command spans and thus allow new commands to be used in the same theory where defined;
 wenzelm parents: 
46958diff
changeset | 174 | |
| 
cdc791910460
defer actual parsing of command spans and thus allow new commands to be used in the same theory where defined;
 wenzelm parents: 
46958diff
changeset | 175 | fun proof_result (tr, trs) (st, _) = | 
| 
cdc791910460
defer actual parsing of command spans and thus allow new commands to be used in the same theory where defined;
 wenzelm parents: 
46958diff
changeset | 176 | let | 
| 
cdc791910460
defer actual parsing of command spans and thus allow new commands to be used in the same theory where defined;
 wenzelm parents: 
46958diff
changeset | 177 | val (result, st') = Toplevel.proof_result immediate (tr, trs) st; | 
| 
cdc791910460
defer actual parsing of command spans and thus allow new commands to be used in the same theory where defined;
 wenzelm parents: 
46958diff
changeset | 178 | val pos' = Toplevel.pos_of (List.last (tr :: trs)); | 
| 
cdc791910460
defer actual parsing of command spans and thus allow new commands to be used in the same theory where defined;
 wenzelm parents: 
46958diff
changeset | 179 | in (result, (st', pos')) end; | 
| 
cdc791910460
defer actual parsing of command spans and thus allow new commands to be used in the same theory where defined;
 wenzelm parents: 
46958diff
changeset | 180 | |
| 
cdc791910460
defer actual parsing of command spans and thus allow new commands to be used in the same theory where defined;
 wenzelm parents: 
46958diff
changeset | 181 | fun element_result elem x = | 
| 
cdc791910460
defer actual parsing of command spans and thus allow new commands to be used in the same theory where defined;
 wenzelm parents: 
46958diff
changeset | 182 | fold_map proof_result | 
| 
cdc791910460
defer actual parsing of command spans and thus allow new commands to be used in the same theory where defined;
 wenzelm parents: 
46958diff
changeset | 183 | (Outer_Syntax.read_element (#2 (Outer_Syntax.get_syntax ())) init elem) x; | 
| 
cdc791910460
defer actual parsing of command spans and thus allow new commands to be used in the same theory where defined;
 wenzelm parents: 
46958diff
changeset | 184 | |
| 
cdc791910460
defer actual parsing of command spans and thus allow new commands to be used in the same theory where defined;
 wenzelm parents: 
46958diff
changeset | 185 | val (results, (end_state, end_pos)) = | 
| 
cdc791910460
defer actual parsing of command spans and thus allow new commands to be used in the same theory where defined;
 wenzelm parents: 
46958diff
changeset | 186 | fold_map element_result elements (Toplevel.toplevel, Position.none); | 
| 
cdc791910460
defer actual parsing of command spans and thus allow new commands to be used in the same theory where defined;
 wenzelm parents: 
46958diff
changeset | 187 | |
| 
cdc791910460
defer actual parsing of command spans and thus allow new commands to be used in the same theory where defined;
 wenzelm parents: 
46958diff
changeset | 188 | val thy = Toplevel.end_theory end_pos end_state; | 
| 
cdc791910460
defer actual parsing of command spans and thus allow new commands to be used in the same theory where defined;
 wenzelm parents: 
46958diff
changeset | 189 | in (flat results, thy) end; | 
| 
cdc791910460
defer actual parsing of command spans and thus allow new commands to be used in the same theory where defined;
 wenzelm parents: 
46958diff
changeset | 190 | |
| 46938 
cda018294515
some support for outer syntax keyword declarations within theory header;
 wenzelm parents: 
46811diff
changeset | 191 | fun load_thy update_time dir header pos text parents = | 
| 43712 
3c2c912af2ef
moved Outer_Syntax.load_thy to Thy_Load.load_thy;
 wenzelm parents: 
43702diff
changeset | 192 | let | 
| 
3c2c912af2ef
moved Outer_Syntax.load_thy to Thy_Load.load_thy;
 wenzelm parents: 
43702diff
changeset | 193 | val time = ! Toplevel.timing; | 
| 
3c2c912af2ef
moved Outer_Syntax.load_thy to Thy_Load.load_thy;
 wenzelm parents: 
43702diff
changeset | 194 | |
| 46938 
cda018294515
some support for outer syntax keyword declarations within theory header;
 wenzelm parents: 
46811diff
changeset | 195 |     val {name, imports, uses, ...} = header;
 | 
| 46958 
0ec8f04e753a
define keywords early when processing the theory header, before running the body commands;
 wenzelm parents: 
46938diff
changeset | 196 | val _ = Thy_Header.define_keywords header; | 
| 43712 
3c2c912af2ef
moved Outer_Syntax.load_thy to Thy_Load.load_thy;
 wenzelm parents: 
43702diff
changeset | 197 | val _ = Present.init_theory name; | 
| 44186 
806f0ec1a43d
simplified Toplevel.init_theory: discontinued special master argument;
 wenzelm parents: 
44113diff
changeset | 198 | fun init () = | 
| 46938 
cda018294515
some support for outer syntax keyword declarations within theory header;
 wenzelm parents: 
46811diff
changeset | 199 | begin_theory dir header parents | 
| 43712 
3c2c912af2ef
moved Outer_Syntax.load_thy to Thy_Load.load_thy;
 wenzelm parents: 
43702diff
changeset | 200 | |> Present.begin_theory update_time dir uses; | 
| 
3c2c912af2ef
moved Outer_Syntax.load_thy to Thy_Load.load_thy;
 wenzelm parents: 
43702diff
changeset | 201 | |
| 46959 
cdc791910460
defer actual parsing of command spans and thus allow new commands to be used in the same theory where defined;
 wenzelm parents: 
46958diff
changeset | 202 | val lexs = Keyword.get_lexicons (); | 
| 46958 
0ec8f04e753a
define keywords early when processing the theory header, before running the body commands;
 wenzelm parents: 
46938diff
changeset | 203 | |
| 46811 
03a2dc9e0624
clarified command span: include trailing whitespace/comments and thus reduce number of ignored spans with associated transactions and states (factor 2);
 wenzelm parents: 
46737diff
changeset | 204 | val toks = Thy_Syntax.parse_tokens lexs pos text; | 
| 
03a2dc9e0624
clarified command span: include trailing whitespace/comments and thus reduce number of ignored spans with associated transactions and states (factor 2);
 wenzelm parents: 
46737diff
changeset | 205 | val spans = Thy_Syntax.parse_spans toks; | 
| 46959 
cdc791910460
defer actual parsing of command spans and thus allow new commands to be used in the same theory where defined;
 wenzelm parents: 
46958diff
changeset | 206 | val elements = Thy_Syntax.parse_elements spans; | 
| 43712 
3c2c912af2ef
moved Outer_Syntax.load_thy to Thy_Load.load_thy;
 wenzelm parents: 
43702diff
changeset | 207 | |
| 
3c2c912af2ef
moved Outer_Syntax.load_thy to Thy_Load.load_thy;
 wenzelm parents: 
43702diff
changeset | 208 | val _ = Present.theory_source name | 
| 
3c2c912af2ef
moved Outer_Syntax.load_thy to Thy_Load.load_thy;
 wenzelm parents: 
43702diff
changeset | 209 | (fn () => HTML.html_mode (implode o map Thy_Syntax.present_span) spans); | 
| 
3c2c912af2ef
moved Outer_Syntax.load_thy to Thy_Load.load_thy;
 wenzelm parents: 
43702diff
changeset | 210 | |
| 
3c2c912af2ef
moved Outer_Syntax.load_thy to Thy_Load.load_thy;
 wenzelm parents: 
43702diff
changeset | 211 |     val _ = if time then writeln ("\n**** Starting theory " ^ quote name ^ " ****") else ();
 | 
| 46959 
cdc791910460
defer actual parsing of command spans and thus allow new commands to be used in the same theory where defined;
 wenzelm parents: 
46958diff
changeset | 212 | val (results, thy) = cond_timeit time "" (fn () => excursion init elements); | 
| 43712 
3c2c912af2ef
moved Outer_Syntax.load_thy to Thy_Load.load_thy;
 wenzelm parents: 
43702diff
changeset | 213 |     val _ = if time then writeln ("**** Finished theory " ^ quote name ^ " ****\n") else ();
 | 
| 
3c2c912af2ef
moved Outer_Syntax.load_thy to Thy_Load.load_thy;
 wenzelm parents: 
43702diff
changeset | 214 | |
| 
3c2c912af2ef
moved Outer_Syntax.load_thy to Thy_Load.load_thy;
 wenzelm parents: 
43702diff
changeset | 215 | val present = | 
| 
3c2c912af2ef
moved Outer_Syntax.load_thy to Thy_Load.load_thy;
 wenzelm parents: 
43702diff
changeset | 216 |       singleton (Future.cond_forks {name = "Outer_Syntax.present:" ^ name, group = NONE,
 | 
| 44113 | 217 | deps = map Future.task_of results, pri = 0, interrupts = true}) | 
| 43712 
3c2c912af2ef
moved Outer_Syntax.load_thy to Thy_Load.load_thy;
 wenzelm parents: 
43702diff
changeset | 218 | (fn () => | 
| 46959 
cdc791910460
defer actual parsing of command spans and thus allow new commands to be used in the same theory where defined;
 wenzelm parents: 
46958diff
changeset | 219 | let val ((minor, _), outer_syntax) = Outer_Syntax.get_syntax () in | 
| 
cdc791910460
defer actual parsing of command spans and thus allow new commands to be used in the same theory where defined;
 wenzelm parents: 
46958diff
changeset | 220 | Thy_Output.present_thy minor Keyword.command_tags | 
| 
cdc791910460
defer actual parsing of command spans and thus allow new commands to be used in the same theory where defined;
 wenzelm parents: 
46958diff
changeset | 221 | (Outer_Syntax.is_markup outer_syntax) | 
| 
cdc791910460
defer actual parsing of command spans and thus allow new commands to be used in the same theory where defined;
 wenzelm parents: 
46958diff
changeset | 222 | (maps Future.join results) toks | 
| 
cdc791910460
defer actual parsing of command spans and thus allow new commands to be used in the same theory where defined;
 wenzelm parents: 
46958diff
changeset | 223 | |> Buffer.content | 
| 
cdc791910460
defer actual parsing of command spans and thus allow new commands to be used in the same theory where defined;
 wenzelm parents: 
46958diff
changeset | 224 | |> Present.theory_output name | 
| 
cdc791910460
defer actual parsing of command spans and thus allow new commands to be used in the same theory where defined;
 wenzelm parents: 
46958diff
changeset | 225 | end); | 
| 43712 
3c2c912af2ef
moved Outer_Syntax.load_thy to Thy_Load.load_thy;
 wenzelm parents: 
43702diff
changeset | 226 | |
| 
3c2c912af2ef
moved Outer_Syntax.load_thy to Thy_Load.load_thy;
 wenzelm parents: 
43702diff
changeset | 227 | in (thy, present) end; | 
| 
3c2c912af2ef
moved Outer_Syntax.load_thy to Thy_Load.load_thy;
 wenzelm parents: 
43702diff
changeset | 228 | |
| 42002 | 229 | |
| 230 | (* global master path *) | |
| 231 | ||
| 232 | local | |
| 233 | val master_path = Unsynchronized.ref Path.current; | |
| 234 | in | |
| 235 | ||
| 236 | fun set_master_path path = master_path := path; | |
| 237 | fun get_master_path () = ! master_path; | |
| 238 | ||
| 6168 | 239 | end; | 
| 240 | ||
| 42002 | 241 | end; |