| author | wenzelm | 
| Wed, 23 Jan 2008 23:35:23 +0100 | |
| changeset 25949 | 850b4c2d0f17 | 
| parent 24189 | 1fa9852643a3 | 
| child 26455 | 1757a6e049f4 | 
| permissions | -rw-r--r-- | 
| 6168 | 1 | (* Title: Pure/Thy/thy_load.ML | 
| 2 | ID: $Id$ | |
| 3 | Author: Markus Wenzel, TU Muenchen | |
| 4 | ||
| 15801 | 5 | Theory loader primitives, including load path. | 
| 6168 | 6 | *) | 
| 7 | ||
| 8 | signature BASIC_THY_LOAD = | |
| 9 | sig | |
| 10 | val show_path: unit -> string list | |
| 11 | val add_path: string -> unit | |
| 10252 | 12 | val path_add: string -> unit | 
| 6168 | 13 | val del_path: string -> unit | 
| 7438 | 14 |   val with_path: string -> ('a -> 'b) -> 'a -> 'b
 | 
| 9103 | 15 |   val with_paths: string list -> ('a -> 'b) -> 'a -> 'b
 | 
| 6205 | 16 | val reset_path: unit -> unit | 
| 6168 | 17 | end; | 
| 18 | ||
| 19 | signature THY_LOAD = | |
| 20 | sig | |
| 21 | include BASIC_THY_LOAD | |
| 17366 | 22 | val ml_exts: string list | 
| 6205 | 23 | val ml_path: string -> Path.T | 
| 7901 | 24 | val thy_path: string -> Path.T | 
| 23885 
09254a1622e3
simplified ThyLoad interfaces: only one additional directory;
 wenzelm parents: 
23876diff
changeset | 25 | val check_file: Path.T -> Path.T -> (Path.T * File.ident) option | 
| 
09254a1622e3
simplified ThyLoad interfaces: only one additional directory;
 wenzelm parents: 
23876diff
changeset | 26 | val check_ml: Path.T -> Path.T -> (Path.T * File.ident) option | 
| 24189 
1fa9852643a3
simplified ThyLoad.deps_thy etc.: discontinued attached ML files;
 wenzelm parents: 
24065diff
changeset | 27 | val check_thy: Path.T -> string -> Path.T * File.ident | 
| 
1fa9852643a3
simplified ThyLoad.deps_thy etc.: discontinued attached ML files;
 wenzelm parents: 
24065diff
changeset | 28 | val deps_thy: Path.T -> string -> | 
| 
1fa9852643a3
simplified ThyLoad.deps_thy etc.: discontinued attached ML files;
 wenzelm parents: 
24065diff
changeset | 29 |    {master: Path.T * File.ident, text: string list, imports: string list, uses: Path.T list}
 | 
| 23885 
09254a1622e3
simplified ThyLoad interfaces: only one additional directory;
 wenzelm parents: 
23876diff
changeset | 30 | val load_ml: Path.T -> Path.T -> Path.T * File.ident | 
| 24189 
1fa9852643a3
simplified ThyLoad.deps_thy etc.: discontinued attached ML files;
 wenzelm parents: 
24065diff
changeset | 31 | val load_thy: Path.T -> string -> Position.T -> string list -> bool -> unit | 
| 6168 | 32 | end; | 
| 33 | ||
| 34 | signature PRIVATE_THY_LOAD = | |
| 35 | sig | |
| 36 | include THY_LOAD | |
| 24065 | 37 | (*this backdoor is sealed later*) | 
| 24189 
1fa9852643a3
simplified ThyLoad.deps_thy etc.: discontinued attached ML files;
 wenzelm parents: 
24065diff
changeset | 38 | val load_thy_fn: (Path.T -> string -> Position.T -> string list -> bool -> unit) ref | 
| 6168 | 39 | end; | 
| 40 | ||
| 41 | structure ThyLoad: PRIVATE_THY_LOAD = | |
| 42 | struct | |
| 43 | ||
| 44 | ||
| 6232 | 45 | (* maintain load path *) | 
| 6168 | 46 | |
| 23944 | 47 | local val load_path = ref [Path.current] in | 
| 6168 | 48 | |
| 21858 
05f57309170c
avoid conflict with Alice keywords: renamed pack -> implode, unpack -> explode, any -> many, avoided assert;
 wenzelm parents: 
17366diff
changeset | 49 | fun show_path () = map Path.implode (! load_path); | 
| 23944 | 50 | |
| 51 | fun del_path s = CRITICAL (fn () => change load_path (remove (op =) (Path.explode s))); | |
| 52 | fun add_path s = CRITICAL (fn () => (del_path s; change load_path (cons (Path.explode s)))); | |
| 53 | fun path_add s = | |
| 54 | CRITICAL (fn () => (del_path s; change load_path (fn path => path @ [Path.explode s]))); | |
| 6205 | 55 | fun reset_path () = load_path := [Path.current]; | 
| 23944 | 56 | |
| 57 | fun with_paths ss f x = | |
| 58 | CRITICAL (fn () => Library.setmp load_path (! load_path @ map Path.explode ss) f x); | |
| 9655 
a4d2da014ec3
renamed cond_with_path to cond_add_path (add to front);
 wenzelm parents: 
9103diff
changeset | 59 | fun with_path s f x = with_paths [s] f x; | 
| 6168 | 60 | |
| 23944 | 61 | fun search_path dir path = | 
| 62 | distinct (op =) (dir :: (if Path.is_basic path then (! load_path) else [Path.current])); | |
| 63 | ||
| 64 | end; | |
| 65 | ||
| 6168 | 66 | |
| 6232 | 67 | (* file formats *) | 
| 6168 | 68 | |
| 23872 | 69 | val ml_exts = ["ML", "sml"]; | 
| 6232 | 70 | val ml_path = Path.ext "ML" o Path.basic; | 
| 71 | val thy_path = Path.ext "thy" o Path.basic; | |
| 6168 | 72 | |
| 73 | ||
| 23872 | 74 | (* check files *) | 
| 6232 | 75 | |
| 23944 | 76 | fun check_ext exts paths dir src_path = | 
| 6232 | 77 | let | 
| 78 | val path = Path.expand src_path; | |
| 23872 | 79 | val _ = Path.is_current path andalso error "Bad file specification"; | 
| 6168 | 80 | |
| 23885 
09254a1622e3
simplified ThyLoad interfaces: only one additional directory;
 wenzelm parents: 
23876diff
changeset | 81 | fun try_ext rel_path ext = | 
| 8750 | 82 | let val ext_path = Path.expand (Path.ext ext rel_path) | 
| 23872 | 83 | in Option.map (fn id => (File.full_path ext_path, id)) (File.ident ext_path) end; | 
| 23885 
09254a1622e3
simplified ThyLoad interfaces: only one additional directory;
 wenzelm parents: 
23876diff
changeset | 84 |     fun try_prfx prfx = get_first (try_ext (Path.append prfx path)) ("" :: exts);
 | 
| 23944 | 85 | in get_first try_prfx paths end; | 
| 6232 | 86 | |
| 23944 | 87 | fun check_file dir path = check_ext [] (search_path dir path) dir path; | 
| 88 | fun check_ml dir path = check_ext ml_exts (search_path dir path) dir path; | |
| 6168 | 89 | |
| 24189 
1fa9852643a3
simplified ThyLoad.deps_thy etc.: discontinued attached ML files;
 wenzelm parents: 
24065diff
changeset | 90 | fun check_thy dir name = | 
| 23944 | 91 | let | 
| 92 | val thy_file = thy_path name; | |
| 93 | val paths = search_path dir thy_file; | |
| 94 | in | |
| 95 | (case check_ext [] paths dir thy_file of | |
| 23872 | 96 |       NONE => error ("Could not find theory file " ^ quote (Path.implode thy_file) ^
 | 
| 23944 | 97 | " in " ^ commas_quote (map Path.implode paths)) | 
| 24189 
1fa9852643a3
simplified ThyLoad.deps_thy etc.: discontinued attached ML files;
 wenzelm parents: 
24065diff
changeset | 98 | | SOME thy_id => thy_id) | 
| 23872 | 99 | end; | 
| 6232 | 100 | |
| 101 | ||
| 23872 | 102 | (* theory deps *) | 
| 7940 | 103 | |
| 24189 
1fa9852643a3
simplified ThyLoad.deps_thy etc.: discontinued attached ML files;
 wenzelm parents: 
24065diff
changeset | 104 | fun deps_thy dir name = | 
| 23872 | 105 | let | 
| 24189 
1fa9852643a3
simplified ThyLoad.deps_thy etc.: discontinued attached ML files;
 wenzelm parents: 
24065diff
changeset | 106 | val master as (path, _) = check_thy dir name; | 
| 24065 | 107 | val text = explode (File.read path); | 
| 23872 | 108 | val (name', imports, uses) = | 
| 24065 | 109 | ThyHeader.read (Position.path path) (Source.of_list_limited 8000 text); | 
| 23872 | 110 | val _ = name = name' orelse | 
| 111 |       error ("Filename " ^ quote (Path.implode (Path.base path)) ^
 | |
| 112 | " does not agree with theory name " ^ quote name'); | |
| 24189 
1fa9852643a3
simplified ThyLoad.deps_thy etc.: discontinued attached ML files;
 wenzelm parents: 
24065diff
changeset | 113 | val uses = map (Path.explode o #1) uses; | 
| 24065 | 114 |   in {master = master, text = text, imports = imports, uses = uses} end;
 | 
| 6484 
3f098b0ec683
use_thy etc.: may specify path prefix, which is temporarily used as load path;
 wenzelm parents: 
6363diff
changeset | 115 | |
| 6168 | 116 | |
| 23872 | 117 | (* load files *) | 
| 6168 | 118 | |
| 23885 
09254a1622e3
simplified ThyLoad interfaces: only one additional directory;
 wenzelm parents: 
23876diff
changeset | 119 | fun load_ml dir raw_path = | 
| 
09254a1622e3
simplified ThyLoad interfaces: only one additional directory;
 wenzelm parents: 
23876diff
changeset | 120 | (case check_ml dir raw_path of | 
| 23872 | 121 |     NONE => error ("Could not find ML file " ^ quote (Path.implode raw_path))
 | 
| 122 | | SOME (path, id) => (ML_Context.use path; (path, id))); | |
| 6168 | 123 | |
| 23872 | 124 | (*dependent on outer syntax*) | 
| 24065 | 125 | val load_thy_fn = | 
| 24189 
1fa9852643a3
simplified ThyLoad.deps_thy etc.: discontinued attached ML files;
 wenzelm parents: 
24065diff
changeset | 126 | ref (undefined: Path.T -> string -> Position.T -> string list -> bool -> unit); | 
| 
1fa9852643a3
simplified ThyLoad.deps_thy etc.: discontinued attached ML files;
 wenzelm parents: 
24065diff
changeset | 127 | fun load_thy dir name pos text time = ! load_thy_fn dir name pos text time; | 
| 6168 | 128 | |
| 129 | end; | |
| 130 | ||
| 131 | structure BasicThyLoad: BASIC_THY_LOAD = ThyLoad; | |
| 132 | open BasicThyLoad; |