92 of SOME c_ts => pr_app is_closure thm vars fxy c_ts |
92 of SOME c_ts => pr_app is_closure thm vars fxy c_ts |
93 | NONE => brackify fxy |
93 | NONE => brackify fxy |
94 [pr_term is_closure thm vars NOBR t1, pr_term is_closure thm vars BR t2]) |
94 [pr_term is_closure thm vars NOBR t1, pr_term is_closure thm vars BR t2]) |
95 | pr_term is_closure thm vars fxy (t as _ `|=> _) = |
95 | pr_term is_closure thm vars fxy (t as _ `|=> _) = |
96 let |
96 let |
97 val (binds, t') = Code_Thingol.unfold_abs t; |
97 val (binds, t') = Code_Thingol.unfold_pat_abs t; |
98 fun pr ((v, pat), ty) = |
98 fun pr (some_pat, ty) = |
99 pr_bind is_closure thm NOBR ((SOME v, pat), ty) |
99 pr_bind is_closure thm NOBR (some_pat, ty) |
100 #>> (fn p => concat [str "fn", p, str "=>"]); |
100 #>> (fn p => concat [str "fn", p, str "=>"]); |
101 val (ps, vars') = fold_map pr binds vars; |
101 val (ps, vars') = fold_map pr binds vars; |
102 in brackets (ps @ [pr_term is_closure thm vars' NOBR t']) end |
102 in brackets (ps @ [pr_term is_closure thm vars' NOBR t']) end |
103 | pr_term is_closure thm vars fxy (ICase (cases as (_, t0))) = |
103 | pr_term is_closure thm vars fxy (ICase (cases as (_, t0))) = |
104 (case Code_Thingol.unfold_const_app t0 |
104 (case Code_Thingol.unfold_const_app t0 |
120 else |
120 else |
121 (str o deresolve) c |
121 (str o deresolve) c |
122 :: (map (pr_dicts BR) o filter_out null) iss @ map (pr_term is_closure thm vars BR) ts |
122 :: (map (pr_dicts BR) o filter_out null) iss @ map (pr_term is_closure thm vars BR) ts |
123 and pr_app is_closure thm vars = gen_pr_app (pr_app' is_closure) (pr_term is_closure) |
123 and pr_app is_closure thm vars = gen_pr_app (pr_app' is_closure) (pr_term is_closure) |
124 syntax_const thm vars |
124 syntax_const thm vars |
125 and pr_bind' ((NONE, NONE), _) = str "_" |
125 and pr_bind' (NONE, _) = str "_" |
126 | pr_bind' ((SOME v, NONE), _) = str v |
126 | pr_bind' (SOME p, _) = p |
127 | pr_bind' ((NONE, SOME p), _) = p |
|
128 | pr_bind' ((SOME v, SOME p), _) = concat [str v, str "as", p] |
|
129 and pr_bind is_closure = gen_pr_bind pr_bind' (pr_term is_closure) |
127 and pr_bind is_closure = gen_pr_bind pr_bind' (pr_term is_closure) |
130 and pr_case is_closure thm vars fxy (cases as ((_, [_]), _)) = |
128 and pr_case is_closure thm vars fxy (cases as ((_, [_]), _)) = |
131 let |
129 let |
132 val (binds, body) = Code_Thingol.unfold_let (ICase cases); |
130 val (binds, body) = Code_Thingol.unfold_let (ICase cases); |
133 fun pr ((pat, ty), t) vars = |
131 fun pr ((pat, ty), t) vars = |
134 vars |
132 vars |
135 |> pr_bind is_closure thm NOBR ((NONE, SOME pat), ty) |
133 |> pr_bind is_closure thm NOBR (SOME pat, ty) |
136 |>> (fn p => semicolon [str "val", p, str "=", pr_term is_closure thm vars NOBR t]) |
134 |>> (fn p => semicolon [str "val", p, str "=", pr_term is_closure thm vars NOBR t]) |
137 val (ps, vars') = fold_map pr binds vars; |
135 val (ps, vars') = fold_map pr binds vars; |
138 in |
136 in |
139 Pretty.chunks [ |
137 Pretty.chunks [ |
140 [str ("let"), Pretty.fbrk, Pretty.chunks ps] |> Pretty.block, |
138 [str ("let"), Pretty.fbrk, Pretty.chunks ps] |> Pretty.block, |
144 end |
142 end |
145 | pr_case is_closure thm vars fxy (((t, ty), clause :: clauses), _) = |
143 | pr_case is_closure thm vars fxy (((t, ty), clause :: clauses), _) = |
146 let |
144 let |
147 fun pr delim (pat, body) = |
145 fun pr delim (pat, body) = |
148 let |
146 let |
149 val (p, vars') = pr_bind is_closure thm NOBR ((NONE, SOME pat), ty) vars; |
147 val (p, vars') = pr_bind is_closure thm NOBR (SOME pat, ty) vars; |
150 in |
148 in |
151 concat [str delim, p, str "=>", pr_term is_closure thm vars' NOBR body] |
149 concat [str delim, p, str "=>", pr_term is_closure thm vars' NOBR body] |
152 end; |
150 end; |
153 in |
151 in |
154 brackets ( |
152 brackets ( |
401 of SOME c_ts => pr_app is_closure thm vars fxy c_ts |
399 of SOME c_ts => pr_app is_closure thm vars fxy c_ts |
402 | NONE => |
400 | NONE => |
403 brackify fxy [pr_term is_closure thm vars NOBR t1, pr_term is_closure thm vars BR t2]) |
401 brackify fxy [pr_term is_closure thm vars NOBR t1, pr_term is_closure thm vars BR t2]) |
404 | pr_term is_closure thm vars fxy (t as _ `|=> _) = |
402 | pr_term is_closure thm vars fxy (t as _ `|=> _) = |
405 let |
403 let |
406 val (binds, t') = Code_Thingol.unfold_abs t; |
404 val (binds, t') = Code_Thingol.unfold_pat_abs t; |
407 fun pr ((v, pat), ty) = pr_bind is_closure thm BR ((SOME v, pat), ty); |
405 val (ps, vars') = fold_map (pr_bind is_closure thm BR) binds vars; |
408 val (ps, vars') = fold_map pr binds vars; |
|
409 in brackets (str "fun" :: ps @ str "->" @@ pr_term is_closure thm vars' NOBR t') end |
406 in brackets (str "fun" :: ps @ str "->" @@ pr_term is_closure thm vars' NOBR t') end |
410 | pr_term is_closure thm vars fxy (ICase (cases as (_, t0))) = (case Code_Thingol.unfold_const_app t0 |
407 | pr_term is_closure thm vars fxy (ICase (cases as (_, t0))) = (case Code_Thingol.unfold_const_app t0 |
411 of SOME (c_ts as ((c, _), _)) => if is_none (syntax_const c) |
408 of SOME (c_ts as ((c, _), _)) => if is_none (syntax_const c) |
412 then pr_case is_closure thm vars fxy cases |
409 then pr_case is_closure thm vars fxy cases |
413 else pr_app is_closure thm vars fxy c_ts |
410 else pr_app is_closure thm vars fxy c_ts |
425 then (str o deresolve) c @@ str "()" |
422 then (str o deresolve) c @@ str "()" |
426 else (str o deresolve) c |
423 else (str o deresolve) c |
427 :: ((map (pr_dicts BR) o filter_out null) iss @ map (pr_term is_closure thm vars BR) ts) |
424 :: ((map (pr_dicts BR) o filter_out null) iss @ map (pr_term is_closure thm vars BR) ts) |
428 and pr_app is_closure = gen_pr_app (pr_app' is_closure) (pr_term is_closure) |
425 and pr_app is_closure = gen_pr_app (pr_app' is_closure) (pr_term is_closure) |
429 syntax_const |
426 syntax_const |
430 and pr_bind' ((NONE, NONE), _) = str "_" |
427 and pr_bind' (NONE, _) = str "_" |
431 | pr_bind' ((SOME v, NONE), _) = str v |
428 | pr_bind' (SOME p, _) = p |
432 | pr_bind' ((NONE, SOME p), _) = p |
|
433 | pr_bind' ((SOME v, SOME p), _) = brackets [p, str "as", str v] |
|
434 and pr_bind is_closure = gen_pr_bind pr_bind' (pr_term is_closure) |
429 and pr_bind is_closure = gen_pr_bind pr_bind' (pr_term is_closure) |
435 and pr_case is_closure thm vars fxy (cases as ((_, [_]), _)) = |
430 and pr_case is_closure thm vars fxy (cases as ((_, [_]), _)) = |
436 let |
431 let |
437 val (binds, body) = Code_Thingol.unfold_let (ICase cases); |
432 val (binds, body) = Code_Thingol.unfold_let (ICase cases); |
438 fun pr ((pat, ty), t) vars = |
433 fun pr ((pat, ty), t) vars = |
439 vars |
434 vars |
440 |> pr_bind is_closure thm NOBR ((NONE, SOME pat), ty) |
435 |> pr_bind is_closure thm NOBR (SOME pat, ty) |
441 |>> (fn p => concat |
436 |>> (fn p => concat |
442 [str "let", p, str "=", pr_term is_closure thm vars NOBR t, str "in"]) |
437 [str "let", p, str "=", pr_term is_closure thm vars NOBR t, str "in"]) |
443 val (ps, vars') = fold_map pr binds vars; |
438 val (ps, vars') = fold_map pr binds vars; |
444 in |
439 in |
445 brackify_block fxy (Pretty.chunks ps) [] |
440 brackify_block fxy (Pretty.chunks ps) [] |
447 end |
442 end |
448 | pr_case is_closure thm vars fxy (((t, ty), clause :: clauses), _) = |
443 | pr_case is_closure thm vars fxy (((t, ty), clause :: clauses), _) = |
449 let |
444 let |
450 fun pr delim (pat, body) = |
445 fun pr delim (pat, body) = |
451 let |
446 let |
452 val (p, vars') = pr_bind is_closure thm NOBR ((NONE, SOME pat), ty) vars; |
447 val (p, vars') = pr_bind is_closure thm NOBR (SOME pat, ty) vars; |
453 in concat [str delim, p, str "->", pr_term is_closure thm vars' NOBR body] end; |
448 in concat [str delim, p, str "->", pr_term is_closure thm vars' NOBR body] end; |
454 in |
449 in |
455 brackets ( |
450 brackets ( |
456 str "match" |
451 str "match" |
457 :: pr_term is_closure thm vars NOBR t |
452 :: pr_term is_closure thm vars NOBR t |