977 | strip_abs_split i (u as Const ("split", _) $ t) = (case strip_abs_split (i+1) t of |
977 | strip_abs_split i (u as Const ("split", _) $ t) = (case strip_abs_split (i+1) t of |
978 (v :: v' :: vs, u) => (HOLogic.mk_prod (v, v') :: vs, u) |
978 (v :: v' :: vs, u) => (HOLogic.mk_prod (v, v') :: vs, u) |
979 | _ => ([], u)) |
979 | _ => ([], u)) |
980 | strip_abs_split i t = ([], t); |
980 | strip_abs_split i t = ([], t); |
981 |
981 |
982 fun let_codegen thy defs gr dep thyname brack t = (case strip_comb t of |
982 fun let_codegen thy defs dep thyname brack t gr = (case strip_comb t of |
983 (t1 as Const ("Let", _), t2 :: t3 :: ts) => |
983 (t1 as Const ("Let", _), t2 :: t3 :: ts) => |
984 let |
984 let |
985 fun dest_let (l as Const ("Let", _) $ t $ u) = |
985 fun dest_let (l as Const ("Let", _) $ t $ u) = |
986 (case strip_abs_split 1 u of |
986 (case strip_abs_split 1 u of |
987 ([p], u') => apfst (cons (p, t)) (dest_let u') |
987 ([p], u') => apfst (cons (p, t)) (dest_let u') |
988 | _ => ([], l)) |
988 | _ => ([], l)) |
989 | dest_let t = ([], t); |
989 | dest_let t = ([], t); |
990 fun mk_code (gr, (l, r)) = |
990 fun mk_code (l, r) gr = |
991 let |
991 let |
992 val (gr1, pl) = Codegen.invoke_codegen thy defs dep thyname false (gr, l); |
992 val (pl, gr1) = Codegen.invoke_codegen thy defs dep thyname false l gr; |
993 val (gr2, pr) = Codegen.invoke_codegen thy defs dep thyname false (gr1, r); |
993 val (pr, gr2) = Codegen.invoke_codegen thy defs dep thyname false r gr1; |
994 in (gr2, (pl, pr)) end |
994 in ((pl, pr), gr2) end |
995 in case dest_let (t1 $ t2 $ t3) of |
995 in case dest_let (t1 $ t2 $ t3) of |
996 ([], _) => NONE |
996 ([], _) => NONE |
997 | (ps, u) => |
997 | (ps, u) => |
998 let |
998 let |
999 val (gr1, qs) = foldl_map mk_code (gr, ps); |
999 val (qs, gr1) = fold_map mk_code ps gr; |
1000 val (gr2, pu) = Codegen.invoke_codegen thy defs dep thyname false (gr1, u); |
1000 val (pu, gr2) = Codegen.invoke_codegen thy defs dep thyname false u gr1; |
1001 val (gr3, pargs) = foldl_map |
1001 val (pargs, gr3) = fold_map |
1002 (Codegen.invoke_codegen thy defs dep thyname true) (gr2, ts) |
1002 (Codegen.invoke_codegen thy defs dep thyname true) ts gr2 |
1003 in |
1003 in |
1004 SOME (gr3, Codegen.mk_app brack |
1004 SOME (Codegen.mk_app brack |
1005 (Pretty.blk (0, [Codegen.str "let ", Pretty.blk (0, List.concat |
1005 (Pretty.blk (0, [Codegen.str "let ", Pretty.blk (0, List.concat |
1006 (separate [Codegen.str ";", Pretty.brk 1] (map (fn (pl, pr) => |
1006 (separate [Codegen.str ";", Pretty.brk 1] (map (fn (pl, pr) => |
1007 [Pretty.block [Codegen.str "val ", pl, Codegen.str " =", |
1007 [Pretty.block [Codegen.str "val ", pl, Codegen.str " =", |
1008 Pretty.brk 1, pr]]) qs))), |
1008 Pretty.brk 1, pr]]) qs))), |
1009 Pretty.brk 1, Codegen.str "in ", pu, |
1009 Pretty.brk 1, Codegen.str "in ", pu, |
1010 Pretty.brk 1, Codegen.str "end"])) pargs) |
1010 Pretty.brk 1, Codegen.str "end"])) pargs, gr3) |
1011 end |
1011 end |
1012 end |
1012 end |
1013 | _ => NONE); |
1013 | _ => NONE); |
1014 |
1014 |
1015 fun split_codegen thy defs gr dep thyname brack t = (case strip_comb t of |
1015 fun split_codegen thy defs dep thyname brack t gr = (case strip_comb t of |
1016 (t1 as Const ("split", _), t2 :: ts) => |
1016 (t1 as Const ("split", _), t2 :: ts) => |
1017 (case strip_abs_split 1 (t1 $ t2) of |
1017 (case strip_abs_split 1 (t1 $ t2) of |
1018 ([p], u) => |
1018 ([p], u) => |
1019 let |
1019 let |
1020 val (gr1, q) = Codegen.invoke_codegen thy defs dep thyname false (gr, p); |
1020 val (q, gr1) = Codegen.invoke_codegen thy defs dep thyname false p gr; |
1021 val (gr2, pu) = Codegen.invoke_codegen thy defs dep thyname false (gr1, u); |
1021 val (pu, gr2) = Codegen.invoke_codegen thy defs dep thyname false u gr1; |
1022 val (gr3, pargs) = foldl_map |
1022 val (pargs, gr3) = fold_map |
1023 (Codegen.invoke_codegen thy defs dep thyname true) (gr2, ts) |
1023 (Codegen.invoke_codegen thy defs dep thyname true) ts gr2 |
1024 in |
1024 in |
1025 SOME (gr2, Codegen.mk_app brack |
1025 SOME (Codegen.mk_app brack |
1026 (Pretty.block [Codegen.str "(fn ", q, Codegen.str " =>", |
1026 (Pretty.block [Codegen.str "(fn ", q, Codegen.str " =>", |
1027 Pretty.brk 1, pu, Codegen.str ")"]) pargs) |
1027 Pretty.brk 1, pu, Codegen.str ")"]) pargs, gr2) |
1028 end |
1028 end |
1029 | _ => NONE) |
1029 | _ => NONE) |
1030 | _ => NONE); |
1030 | _ => NONE); |
1031 |
1031 |
1032 in |
1032 in |