34 val get_serializer: theory -> string -> bool -> string option -> string option -> Args.T list |
34 val get_serializer: theory -> string -> bool -> string option -> string option -> Args.T list |
35 -> (theory -> string -> string) -> string list option -> CodeThingol.code -> unit; |
35 -> (theory -> string -> string) -> string list option -> CodeThingol.code -> unit; |
36 val assert_serializer: theory -> string -> string; |
36 val assert_serializer: theory -> string -> string; |
37 |
37 |
38 val eval_verbose: bool ref; |
38 val eval_verbose: bool ref; |
39 val eval_term: theory -> (theory -> string -> string) -> CodeThingol.code |
39 val eval_term: theory -> (string * 'a option ref) -> CodeThingol.code |
40 -> (string * 'a option ref) * CodeThingol.iterm -> string list -> 'a; |
40 -> CodeThingol.iterm * CodeThingol.itype -> string list -> 'a; |
41 val code_width: int ref; |
41 val code_width: int ref; |
42 |
42 |
43 val setup: theory -> theory; |
43 val setup: theory -> theory; |
44 end; |
44 end; |
45 |
45 |
187 of SOME pat => CodeThingol.fold_varnames (insert (op =)) pat [] |
187 of SOME pat => CodeThingol.fold_varnames (insert (op =)) pat [] |
188 | NONE => []; |
188 | NONE => []; |
189 val vars' = CodeName.intro_vars (the_list v) vars; |
189 val vars' = CodeName.intro_vars (the_list v) vars; |
190 val vars'' = CodeName.intro_vars vs vars'; |
190 val vars'' = CodeName.intro_vars vs vars'; |
191 val v' = Option.map (CodeName.lookup_var vars') v; |
191 val v' = Option.map (CodeName.lookup_var vars') v; |
192 val pat' = Option.map (pr_term vars'' fxy) pat; |
192 val pat' = Option.map (pr_term true vars'' fxy) pat; |
193 in (pr_bind' ((v', pat'), ty), vars'') end; |
193 in (pr_bind' ((v', pat'), ty), vars'') end; |
194 |
194 |
195 |
195 |
196 (* list, char, string, numeral and monad abstract syntax transformations *) |
196 (* list, char, string, numeral and monad abstract syntax transformations *) |
197 |
197 |
381 and pr_app lhs vars = gen_pr_app pr_app' pr_term const_syntax labelled_name is_cons lhs vars |
381 and pr_app lhs vars = gen_pr_app pr_app' pr_term const_syntax labelled_name is_cons lhs vars |
382 and pr_bind' ((NONE, NONE), _) = str "_" |
382 and pr_bind' ((NONE, NONE), _) = str "_" |
383 | pr_bind' ((SOME v, NONE), _) = str v |
383 | pr_bind' ((SOME v, NONE), _) = str v |
384 | pr_bind' ((NONE, SOME p), _) = p |
384 | pr_bind' ((NONE, SOME p), _) = p |
385 | pr_bind' ((SOME v, SOME p), _) = concat [str v, str "as", p] |
385 | pr_bind' ((SOME v, SOME p), _) = concat [str v, str "as", p] |
386 and pr_bind fxy = gen_pr_bind pr_bind' (pr_term false) fxy |
386 and pr_bind fxy = gen_pr_bind pr_bind' pr_term fxy |
387 and pr_case vars fxy (cases as ((_, [_]), _)) = |
387 and pr_case vars fxy (cases as ((_, [_]), _)) = |
388 let |
388 let |
389 val (binds, t') = CodeThingol.unfold_let (ICase cases); |
389 val (binds, t') = CodeThingol.unfold_let (ICase cases); |
390 fun pr ((pat, ty), t) vars = |
390 fun pr ((pat, ty), t) vars = |
391 vars |
391 vars |
446 (insert (op =)) ts []); |
446 (insert (op =)) ts []); |
447 in |
447 in |
448 concat ( |
448 concat ( |
449 [str definer, (str o deresolv) name] |
449 [str definer, (str o deresolv) name] |
450 @ (if null ts andalso null vs |
450 @ (if null ts andalso null vs |
451 andalso not (ty = ITyVar "_")(*for evaluation*) |
|
452 then [str ":", pr_typ NOBR ty] |
451 then [str ":", pr_typ NOBR ty] |
453 else |
452 else |
454 pr_tyvars vs |
453 pr_tyvars vs |
455 @ map (pr_term true vars BR) ts) |
454 @ map (pr_term true vars BR) ts) |
456 @ [str "=", pr_term false vars NOBR t] |
455 @ [str "=", pr_term false vars NOBR t] |
651 and pr_app lhs vars = gen_pr_app pr_app' pr_term const_syntax labelled_name is_cons lhs vars |
650 and pr_app lhs vars = gen_pr_app pr_app' pr_term const_syntax labelled_name is_cons lhs vars |
652 and pr_bind' ((NONE, NONE), _) = str "_" |
651 and pr_bind' ((NONE, NONE), _) = str "_" |
653 | pr_bind' ((SOME v, NONE), _) = str v |
652 | pr_bind' ((SOME v, NONE), _) = str v |
654 | pr_bind' ((NONE, SOME p), _) = p |
653 | pr_bind' ((NONE, SOME p), _) = p |
655 | pr_bind' ((SOME v, SOME p), _) = brackets [p, str "as", str v] |
654 | pr_bind' ((SOME v, SOME p), _) = brackets [p, str "as", str v] |
656 and pr_bind fxy = gen_pr_bind pr_bind' (pr_term false) fxy |
655 and pr_bind fxy = gen_pr_bind pr_bind' pr_term fxy |
657 and pr_case vars fxy (cases as ((_, [_]), _)) = |
656 and pr_case vars fxy (cases as ((_, [_]), _)) = |
658 let |
657 let |
659 val (binds, t') = CodeThingol.unfold_let (ICase cases); |
658 val (binds, t') = CodeThingol.unfold_let (ICase cases); |
660 fun pr ((pat, ty), t) vars = |
659 fun pr ((pat, ty), t) vars = |
661 vars |
660 vars |
685 | fish_parm _ NONE = NONE; |
684 | fish_parm _ NONE = NONE; |
686 fun fillup_parm _ (_, SOME v) = v |
685 fun fillup_parm _ (_, SOME v) = v |
687 | fillup_parm x (i, NONE) = x ^ string_of_int i; |
686 | fillup_parm x (i, NONE) = x ^ string_of_int i; |
688 fun fish_parms vars eqs = |
687 fun fish_parms vars eqs = |
689 let |
688 let |
690 val fished1 = fold (map2 fish_parm) eqs (replicate (length (hd eqs)) NONE); |
689 val raw_fished = fold (map2 fish_parm) eqs (replicate (length (hd eqs)) NONE); |
691 val x = Name.variant (map_filter I fished1) "x"; |
690 val x = Name.variant (map_filter I raw_fished) "x"; |
692 val fished2 = map_index (fillup_parm x) fished1; |
691 val fished = map_index (fillup_parm x) raw_fished; |
693 val fished3 = fold_rev (fn x => fn xs => Name.variant xs x :: xs) fished2 []; |
692 val vars' = CodeName.intro_vars fished vars; |
694 val vars' = CodeName.intro_vars fished3 vars; |
693 in map (CodeName.lookup_var vars') fished end; |
695 in map (CodeName.lookup_var vars') fished3 end; |
|
696 fun pr_eq (ts, t) = |
694 fun pr_eq (ts, t) = |
697 let |
695 let |
698 val consts = map_filter |
696 val consts = map_filter |
699 (fn c => if (is_some o const_syntax) c |
697 (fn c => if (is_some o const_syntax) c |
700 then NONE else (SOME o NameSpace.base o deresolv) c) |
698 then NONE else (SOME o NameSpace.base o deresolv) c) |
1144 else pr_app lhs vars fxy c_ts |
1142 else pr_app lhs vars fxy c_ts |
1145 | NONE => pr_case vars fxy cases) |
1143 | NONE => pr_case vars fxy cases) |
1146 and pr_app' lhs vars ((c, _), ts) = |
1144 and pr_app' lhs vars ((c, _), ts) = |
1147 (str o deresolv) c :: map (pr_term lhs vars BR) ts |
1145 (str o deresolv) c :: map (pr_term lhs vars BR) ts |
1148 and pr_app lhs vars = gen_pr_app pr_app' pr_term const_syntax labelled_name is_cons lhs vars |
1146 and pr_app lhs vars = gen_pr_app pr_app' pr_term const_syntax labelled_name is_cons lhs vars |
1149 and pr_bind fxy = pr_bind_haskell (pr_term false) fxy |
1147 and pr_bind fxy = pr_bind_haskell pr_term fxy |
1150 and pr_case vars fxy (cases as ((_, [_]), _)) = |
1148 and pr_case vars fxy (cases as ((_, [_]), _)) = |
1151 let |
1149 let |
1152 val (binds, t) = CodeThingol.unfold_let (ICase cases); |
1150 val (binds, t) = CodeThingol.unfold_let (ICase cases); |
1153 fun pr ((pat, ty), t) vars = |
1151 fun pr ((pat, ty), t) vars = |
1154 vars |
1152 vars |
1300 |
1298 |
1301 fun pretty_haskell_monad c_mbind c_kbind = |
1299 fun pretty_haskell_monad c_mbind c_kbind = |
1302 let |
1300 let |
1303 fun pretty pr vars fxy [(t, _)] = |
1301 fun pretty pr vars fxy [(t, _)] = |
1304 let |
1302 let |
1305 val pr_bind = pr_bind_haskell pr; |
1303 val pr_bind = pr_bind_haskell (K pr); |
1306 fun pr_mbind (NONE, t) vars = |
1304 fun pr_mbind (NONE, t) vars = |
1307 (semicolon [pr vars NOBR t], vars) |
1305 (semicolon [pr vars NOBR t], vars) |
1308 | pr_mbind (SOME (bind, true), t) vars = vars |
1306 | pr_mbind (SOME (bind, true), t) vars = vars |
1309 |> pr_bind NOBR bind |
1307 |> pr_bind NOBR bind |
1310 |>> (fn p => semicolon [p, str "<-", pr vars NOBR t]) |
1308 |>> (fn p => semicolon [p, str "<-", pr vars NOBR t]) |
1616 #> check_empty_funs |
1614 #> check_empty_funs |
1617 #> seri module file args (labelled_name thy) reserved (Symtab.lookup alias) (Symtab.lookup prolog) |
1615 #> seri module file args (labelled_name thy) reserved (Symtab.lookup alias) (Symtab.lookup prolog) |
1618 (Symtab.lookup class) (Symtab.lookup tyco) (Symtab.lookup const) |
1616 (Symtab.lookup class) (Symtab.lookup tyco) (Symtab.lookup const) |
1619 end; |
1617 end; |
1620 |
1618 |
1621 fun eval_term thy labelled_name code ((ref_name, reff), t) args = |
1619 fun eval_term thy (ref_name, reff) code (t, ty) args = |
1622 let |
1620 let |
1623 val val_name = "Isabelle_Eval.EVAL.EVAL"; |
1621 val val_name = "Isabelle_Eval.EVAL.EVAL"; |
1624 val val_name' = "Isabelle_Eval.EVAL"; |
1622 val val_name' = "Isabelle_Eval.EVAL"; |
1625 val val_name'_args = space_implode " " (val_name' :: map (enclose "(" ")") args); |
1623 val val_name'_args = space_implode " " (val_name' :: map (enclose "(" ")") args); |
1626 val seri = get_serializer thy "SML" false (SOME "Isabelle_Eval") NONE [] labelled_name; |
1624 val seri = get_serializer thy "SML" false (SOME "Isabelle_Eval") NONE [] CodeName.labelled_name; |
1627 fun eval code = ( |
1625 fun eval code = ( |
1628 reff := NONE; |
1626 reff := NONE; |
1629 seri (SOME [val_name]) code; |
1627 seri (SOME [val_name]) code; |
1630 use_text "generated code for evaluation" Output.ml_output (!eval_verbose) |
1628 use_text "generated code for evaluation" Output.ml_output (!eval_verbose) |
1631 ("val _ = (" ^ ref_name ^ " := SOME (" ^ val_name'_args ^ "))"); |
1629 ("val _ = (" ^ ref_name ^ " := SOME (" ^ val_name'_args ^ "))"); |