src/Tools/code/code_target.ML
changeset 24284 f5afd33f5d02
parent 24251 ae3eb1766e56
child 24294 edfe16773fd4
equal deleted inserted replaced
24283:8ca96f4e49cd 24284:f5afd33f5d02
    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 ^ "))");
  1634             ^ " (reference probably has been shadowed)")
  1632             ^ " (reference probably has been shadowed)")
  1635         | SOME value => value
  1633         | SOME value => value
  1636       );
  1634       );
  1637   in
  1635   in
  1638     code
  1636     code
  1639     |> CodeThingol.add_eval_def (val_name, t)
  1637     |> CodeThingol.add_eval_def (val_name, (t, ty))
  1640     |> eval
  1638     |> eval
  1641   end;
  1639   end;
  1642 
  1640 
  1643 
  1641 
  1644 
  1642