979 val v = Free (s', T) |
979 val v = Free (s', T) |
980 in apfst (cons v) (strip_abs_split (i-1) (subst_bound (v, t))) end |
980 in apfst (cons v) (strip_abs_split (i-1) (subst_bound (v, t))) end |
981 | strip_abs_split i (u as Const ("split", _) $ t) = (case strip_abs_split (i+1) t of |
981 | strip_abs_split i (u as Const ("split", _) $ t) = (case strip_abs_split (i+1) t of |
982 (v :: v' :: vs, u) => (HOLogic.mk_prod (v, v') :: vs, u) |
982 (v :: v' :: vs, u) => (HOLogic.mk_prod (v, v') :: vs, u) |
983 | _ => ([], u)) |
983 | _ => ([], u)) |
984 | strip_abs_split i t = ([], t); |
984 | strip_abs_split i t = |
|
985 strip_abs_split i (Abs ("x", hd (binder_types (fastype_of t)), t $ Bound 0)); |
985 |
986 |
986 fun let_codegen thy defs dep thyname brack t gr = (case strip_comb t of |
987 fun let_codegen thy defs dep thyname brack t gr = (case strip_comb t of |
987 (t1 as Const ("Let", _), t2 :: t3 :: ts) => |
988 (t1 as Const ("Let", _), t2 :: t3 :: ts) => |
988 let |
989 let |
989 fun dest_let (l as Const ("Let", _) $ t $ u) = |
990 fun dest_let (l as Const ("Let", _) $ t $ u) = |
1016 end |
1017 end |
1017 | _ => NONE); |
1018 | _ => NONE); |
1018 |
1019 |
1019 fun split_codegen thy defs dep thyname brack t gr = (case strip_comb t of |
1020 fun split_codegen thy defs dep thyname brack t gr = (case strip_comb t of |
1020 (t1 as Const ("split", _), t2 :: ts) => |
1021 (t1 as Const ("split", _), t2 :: ts) => |
1021 (case strip_abs_split 1 (t1 $ t2) of |
1022 let |
1022 ([p], u) => |
1023 val ([p], u) = strip_abs_split 1 (t1 $ t2); |
1023 let |
1024 val (q, gr1) = Codegen.invoke_codegen thy defs dep thyname false p gr; |
1024 val (q, gr1) = Codegen.invoke_codegen thy defs dep thyname false p gr; |
1025 val (pu, gr2) = Codegen.invoke_codegen thy defs dep thyname false u gr1; |
1025 val (pu, gr2) = Codegen.invoke_codegen thy defs dep thyname false u gr1; |
1026 val (pargs, gr3) = fold_map |
1026 val (pargs, gr3) = fold_map |
1027 (Codegen.invoke_codegen thy defs dep thyname true) ts gr2 |
1027 (Codegen.invoke_codegen thy defs dep thyname true) ts gr2 |
1028 in |
1028 in |
1029 SOME (Codegen.mk_app brack |
1029 SOME (Codegen.mk_app brack |
1030 (Pretty.block [Codegen.str "(fn ", q, Codegen.str " =>", |
1030 (Pretty.block [Codegen.str "(fn ", q, Codegen.str " =>", |
1031 Pretty.brk 1, pu, Codegen.str ")"]) pargs, gr2) |
1031 Pretty.brk 1, pu, Codegen.str ")"]) pargs, gr2) |
1032 end |
1032 end |
|
1033 | _ => NONE) |
|
1034 | _ => NONE); |
1033 | _ => NONE); |
1035 |
1034 |
1036 in |
1035 in |
1037 |
1036 |
1038 Codegen.add_codegen "let_codegen" let_codegen |
1037 Codegen.add_codegen "let_codegen" let_codegen |