323 let |
323 let |
324 val (args1, args2) = chop (length ms) args; |
324 val (args1, args2) = chop (length ms) args; |
325 val (gr', (ps, mode_id)) = foldl_map |
325 val (gr', (ps, mode_id)) = foldl_map |
326 (compile_expr thy defs dep module true modes) (gr, ms ~~ args1) |>>> |
326 (compile_expr thy defs dep module true modes) (gr, ms ~~ args1) |>>> |
327 modename module name mode; |
327 modename module name mode; |
328 val (gr'', ps') = foldl_map |
328 val (gr'', ps') = (case mode of |
329 (invoke_codegen thy defs dep module true) (gr', args2) |
329 ([], []) => (gr', [Pretty.str "()"]) |
|
330 | _ => foldl_map |
|
331 (invoke_codegen thy defs dep module true) (gr', args2)) |
330 in (gr', (if brack andalso not (null ps andalso null ps') then |
332 in (gr', (if brack andalso not (null ps andalso null ps') then |
331 single o parens o Pretty.block else I) |
333 single o parens o Pretty.block else I) |
332 (List.concat (separate [Pretty.brk 1] |
334 (List.concat (separate [Pretty.brk 1] |
333 ([Pretty.str mode_id] :: ps @ map single ps')))) |
335 ([Pretty.str mode_id] :: ps @ map single ps')))) |
334 end |
336 end |
396 let |
398 let |
397 val (in_ts, out_ts''') = get_args js 1 us; |
399 val (in_ts, out_ts''') = get_args js 1 us; |
398 val (gr2, in_ps) = foldl_map |
400 val (gr2, in_ps) = foldl_map |
399 (invoke_codegen thy defs dep module true) (gr1, in_ts); |
401 (invoke_codegen thy defs dep module true) (gr1, in_ts); |
400 val (gr3, ps) = if is_ind t then |
402 val (gr3, ps) = if is_ind t then |
401 apsnd (fn ps => ps @ Pretty.brk 1 :: |
403 apsnd (fn ps => ps @ |
|
404 (if null in_ps then [] else [Pretty.brk 1]) @ |
402 separate (Pretty.brk 1) in_ps) |
405 separate (Pretty.brk 1) in_ps) |
403 (compile_expr thy defs dep module false modes |
406 (compile_expr thy defs dep module false modes |
404 (gr2, (mode, t))) |
407 (gr2, (mode, t))) |
405 else |
408 else |
406 apsnd (fn p => [Pretty.str "Seq.of_list", Pretty.brk 1, p]) |
409 apsnd (fn p => [Pretty.str "Seq.of_list", Pretty.brk 1, p]) |
440 modename module s mode |
443 modename module s mode |
441 in |
444 in |
442 ((gr', "and "), Pretty.block |
445 ((gr', "and "), Pretty.block |
443 ([Pretty.block (separate (Pretty.brk 1) |
446 ([Pretty.block (separate (Pretty.brk 1) |
444 (Pretty.str (prfx ^ mode_id) :: |
447 (Pretty.str (prfx ^ mode_id) :: |
445 map Pretty.str arg_vs @ xs) @ |
448 map Pretty.str arg_vs @ |
|
449 (case mode of ([], []) => [Pretty.str "()"] | _ => xs)) @ |
446 [Pretty.str " ="]), |
450 [Pretty.str " ="]), |
447 Pretty.brk 1] @ |
451 Pretty.brk 1] @ |
448 List.concat (separate [Pretty.str " ++", Pretty.brk 1] (map single cl_ps)))) |
452 List.concat (separate [Pretty.str " ++", Pretty.brk 1] (map single cl_ps)))) |
449 end; |
453 end; |
450 |
454 |
489 mk_ind_def thy defs gr dep names (if_library thyname module) |
493 mk_ind_def thy defs gr dep names (if_library thyname module) |
490 [] (prep_intrs intrs) nparms)) |
494 [] (prep_intrs intrs) nparms)) |
491 (gr, foldr add_term_consts [] ts) |
495 (gr, foldr add_term_consts [] ts) |
492 |
496 |
493 and mk_ind_def thy defs gr dep names module modecs intrs nparms = |
497 and mk_ind_def thy defs gr dep names module modecs intrs nparms = |
494 add_edge (hd names, dep) gr handle Graph.UNDEF _ => |
498 add_edge_acyclic (hd names, dep) gr handle |
|
499 Graph.CYCLES (xs :: _) => |
|
500 error ("InductiveCodegen: illegal cyclic dependencies:\n" ^ commas xs) |
|
501 | Graph.UNDEF _ => |
495 let |
502 let |
496 val _ $ u = Logic.strip_imp_concl (hd intrs); |
503 val _ $ u = Logic.strip_imp_concl (hd intrs); |
497 val args = List.take (snd (strip_comb u), nparms); |
504 val args = List.take (snd (strip_comb u), nparms); |
498 val arg_vs = List.concat (map term_vs args); |
505 val arg_vs = List.concat (map term_vs args); |
499 |
506 |