src/Tools/Code/code_ml.ML
changeset 31874 f172346ba805
parent 31775 2b04504fcb69
child 31889 fb2c8a687529
equal deleted inserted replaced
31873:00878e406bf5 31874:f172346ba805
    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