88 else if x = Root then rev_app (x :: xs) ys |
88 else if x = Root then rev_app (x :: xs) ys |
89 else rev_app xs ys |
89 else rev_app xs ys |
90 | rev_app xs (y :: ys) = rev_app (y :: xs) ys; |
90 | rev_app xs (y :: ys) = rev_app (y :: xs) ys; |
91 |
91 |
92 fun append (Path xs) (Path ys) = Path (rev_app (rev xs) ys); |
92 fun append (Path xs) (Path ys) = Path (rev_app (rev xs) ys); |
93 fun appends paths = foldl (uncurry append) (current, paths); |
93 fun appends paths = Library.foldl (uncurry append) (current, paths); |
94 val make = appends o map basic; |
94 val make = appends o map basic; |
95 fun norm path = rev_app [] path; |
95 fun norm path = rev_app [] path; |
96 |
96 |
97 |
97 |
98 (* pack *) |
98 (* pack *) |
140 | ext e path = split_path (fn (prfx, s) => append (Path prfx) (basic (s ^ "." ^ e))) path; |
140 | ext e path = split_path (fn (prfx, s) => append (Path prfx) (basic (s ^ "." ^ e))) path; |
141 |
141 |
142 val split_ext = split_path (fn (prfx, s) => apfst (append (Path prfx)) |
142 val split_ext = split_path (fn (prfx, s) => apfst (append (Path prfx)) |
143 (case take_suffix (not_equal ".") (explode s) of |
143 (case take_suffix (not_equal ".") (explode s) of |
144 ([], _) => (Path [Basic s], "") |
144 ([], _) => (Path [Basic s], "") |
145 | (cs, e) => (Path [Basic (implode (take (length cs - 1, cs)))], implode e))); |
145 | (cs, e) => (Path [Basic (implode (Library.take (length cs - 1, cs)))], implode e))); |
146 |
146 |
147 |
147 |
148 (* evaluate variables *) |
148 (* evaluate variables *) |
149 |
149 |
150 fun eval env (Variable s) = rep (env s) |
150 fun eval env (Variable s) = rep (env s) |
151 | eval _ x = [x]; |
151 | eval _ x = [x]; |
152 |
152 |
153 fun evaluate env (Path xs) = |
153 fun evaluate env (Path xs) = |
154 Path (norm (flat (map (eval env) xs))); |
154 Path (norm (List.concat (map (eval env) xs))); |
155 |
155 |
156 val expand = evaluate (unpack o getenv); |
156 val expand = evaluate (unpack o getenv); |
157 |
157 |
158 val position = Position.line_name 1 o quote o pack o expand; |
158 val position = Position.line_name 1 o quote o pack o expand; |
159 |
159 |