src/Tools/Code/code_scala.ML
author wenzelm
Tue, 10 Sep 2024 20:06:51 +0200
changeset 80847 93c2058896a4
parent 80086 1b986e5f9764
permissions -rw-r--r--
clarified signature, roughly following Isabelle/Scala;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
37745
6315b6426200 checking generated code for various target languages
haftmann
parents: 37669
diff changeset
     1
(*  Title:      Tools/Code/code_scala.ML
6315b6426200 checking generated code for various target languages
haftmann
parents: 37669
diff changeset
     2
    Author:     Florian Haftmann, TU Muenchen
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
     3
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
     4
Serializer for Scala.
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
     5
*)
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
     6
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
     7
signature CODE_SCALA =
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
     8
sig
37745
6315b6426200 checking generated code for various target languages
haftmann
parents: 37669
diff changeset
     9
  val target: string
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
    10
end;
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
    11
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
    12
structure Code_Scala : CODE_SCALA =
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
    13
struct
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
    14
55150
0940309ed8f1 less clumsy namespace
haftmann
parents: 55147
diff changeset
    15
open Basic_Code_Symbol;
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
    16
open Basic_Code_Thingol;
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
    17
open Code_Printer;
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
    18
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
    19
infixr 5 @@;
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
    20
infixr 5 @|;
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
    21
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
    22
(** Scala serializer **)
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
    23
63350
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
    24
val target = "Scala";
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
    25
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67496
diff changeset
    26
val print_scala_string =
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67496
diff changeset
    27
  let
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67496
diff changeset
    28
    fun chr i = "\\u" ^ align_right "0" 4 (Int.fmt StringCvt.HEX i)
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67496
diff changeset
    29
    fun char c = if c = "'" then "\\'"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67496
diff changeset
    30
      else if c = "\"" then "\\\""
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67496
diff changeset
    31
      else if c = "\\" then "\\\\"
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67496
diff changeset
    32
      else
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67496
diff changeset
    33
        let
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67496
diff changeset
    34
          val i = ord c
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67496
diff changeset
    35
        in
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67496
diff changeset
    36
          if i < 32 orelse i > 126
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67496
diff changeset
    37
          then chr i
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67496
diff changeset
    38
          else if i >= 128
68034
27ba50c79328 more correct error message
haftmann
parents: 68028
diff changeset
    39
          then error "non-ASCII byte in Scala string literal"
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67496
diff changeset
    40
          else c
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67496
diff changeset
    41
        end
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67496
diff changeset
    42
  in quote o translate_string char end;
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67496
diff changeset
    43
63350
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
    44
datatype scala_stmt = Fun of typscheme * ((iterm list * iterm) * (thm option * bool)) list
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
    45
  | Datatype of vname list * ((string * vname list) * itype list) list
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
    46
  | Class of (vname * ((class * class) list * (string * itype) list))
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
    47
      * (string * { vs: (vname * sort) list,
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
    48
      inst_params: ((string * (const * int)) * (thm * bool)) list,
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
    49
      superinst_params: ((string * (const * int)) * (thm * bool)) list }) list;
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
    50
47609
b3dab1892cda dropped dead code
haftmann
parents: 46850
diff changeset
    51
fun print_scala_stmt tyco_syntax const_syntax reserved
50626
e21485358c56 uniform parentheses for constructor -- necessary to accomodate scala 10
haftmann
parents: 48568
diff changeset
    52
    args_num is_constr (deresolve, deresolve_full) =
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
    53
  let
55150
0940309ed8f1 less clumsy namespace
haftmann
parents: 55147
diff changeset
    54
    val deresolve_const = deresolve o Constant;
0940309ed8f1 less clumsy namespace
haftmann
parents: 55147
diff changeset
    55
    val deresolve_tyco = deresolve o Type_Constructor;
0940309ed8f1 less clumsy namespace
haftmann
parents: 55147
diff changeset
    56
    val deresolve_class = deresolve o Type_Class;
56812
baef1c110f12 centralized upper/lowercase name mangling
haftmann
parents: 55776
diff changeset
    57
    fun lookup_tyvar tyvars = lookup_var tyvars o Name.enforce_case true;
baef1c110f12 centralized upper/lowercase name mangling
haftmann
parents: 55776
diff changeset
    58
    fun intro_tyvars vs = intro_vars (map (Name.enforce_case true o fst) vs);
55147
bce3dbc11f95 prefer explicit code symbol type over ad-hoc name mangling
haftmann
parents: 55145
diff changeset
    59
    fun print_tyco_expr tyvars fxy (sym, tys) = applify "[" "]"
bce3dbc11f95 prefer explicit code symbol type over ad-hoc name mangling
haftmann
parents: 55145
diff changeset
    60
          (print_typ tyvars NOBR) fxy ((str o deresolve) sym) tys
38923
79d7f2b4cf71 more coherent naming of syntax data structures
haftmann
parents: 38922
diff changeset
    61
    and print_typ tyvars fxy (tyco `%% tys) = (case tyco_syntax tyco
55150
0940309ed8f1 less clumsy namespace
haftmann
parents: 55147
diff changeset
    62
         of NONE => print_tyco_expr tyvars fxy (Type_Constructor tyco, tys)
47609
b3dab1892cda dropped dead code
haftmann
parents: 46850
diff changeset
    63
          | SOME (_, print) => print (print_typ tyvars) fxy tys)
37243
6e2ac5358d6e capitalized type variables; added yield as keyword
haftmann
parents: 37224
diff changeset
    64
      | print_typ tyvars fxy (ITyVar v) = (str o lookup_tyvar tyvars) v;
55150
0940309ed8f1 less clumsy namespace
haftmann
parents: 55147
diff changeset
    65
    fun print_dicttyp tyvars (class, ty) = print_tyco_expr tyvars NOBR (Type_Class class, [ty]);
37639
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
    66
    fun print_tupled_typ tyvars ([], ty) =
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
    67
          print_typ tyvars NOBR ty
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
    68
      | print_tupled_typ tyvars ([ty1], ty2) =
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
    69
          concat [print_typ tyvars BR ty1, str "=>", print_typ tyvars NOBR ty2]
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
    70
      | print_tupled_typ tyvars (tys, ty) =
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
    71
          concat [enum "," "(" ")" (map (print_typ tyvars NOBR) tys),
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
    72
            str "=>", print_typ tyvars NOBR ty];
78594
1cce41dc0c41 clarified generated Scala, for the sake of "scalac -source 3.3";
wenzelm
parents: 77707
diff changeset
    73
    fun constraint p1 p2 = Pretty.block [p1, str " : ", p2];
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
    74
    fun print_var vars NONE = str "_"
63303
7cffe366d333 explicit resolution of ambiguous dictionaries
haftmann
parents: 61130
diff changeset
    75
      | print_var vars (SOME v) = (str o lookup_var vars) v;
7cffe366d333 explicit resolution of ambiguous dictionaries
haftmann
parents: 61130
diff changeset
    76
    fun applify_dict tyvars (Dict (_, d)) = applify_plain_dict tyvars d
7cffe366d333 explicit resolution of ambiguous dictionaries
haftmann
parents: 61130
diff changeset
    77
    and applify_plain_dict tyvars (Dict_Const (inst, dss)) =
77707
a6a81f848135 More explicit type information in dictionary arguments.
haftmann
parents: 77703
diff changeset
    78
          applify_dictss tyvars ((str o deresolve o Class_Instance) inst) (map snd dss)
63303
7cffe366d333 explicit resolution of ambiguous dictionaries
haftmann
parents: 61130
diff changeset
    79
      | applify_plain_dict tyvars (Dict_Var { var, class, ... }) =
7cffe366d333 explicit resolution of ambiguous dictionaries
haftmann
parents: 61130
diff changeset
    80
          Pretty.block [str "implicitly",
7cffe366d333 explicit resolution of ambiguous dictionaries
haftmann
parents: 61130
diff changeset
    81
            enclose "[" "]" [Pretty.block [(str o deresolve_class) class,
7cffe366d333 explicit resolution of ambiguous dictionaries
haftmann
parents: 61130
diff changeset
    82
              enclose "[" "]" [(str o lookup_tyvar tyvars) var]]]]
7cffe366d333 explicit resolution of ambiguous dictionaries
haftmann
parents: 61130
diff changeset
    83
    and applify_dictss tyvars p dss =
7cffe366d333 explicit resolution of ambiguous dictionaries
haftmann
parents: 61130
diff changeset
    84
      applify "(" ")" (applify_dict tyvars) NOBR p (flat dss)
48072
ace701efe203 prefer records with speaking labels over deeply nested tuples
haftmann
parents: 48003
diff changeset
    85
    fun print_term tyvars is_pat some_thm vars fxy (IConst const) =
ace701efe203 prefer records with speaking labels over deeply nested tuples
haftmann
parents: 48003
diff changeset
    86
          print_app tyvars is_pat some_thm vars fxy (const, [])
35228
ac2cab4583f4 context theorem is optional
haftmann
parents: 34944
diff changeset
    87
      | print_term tyvars is_pat some_thm vars fxy (t as (t1 `$ t2)) =
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
    88
          (case Code_Thingol.unfold_const_app t
35228
ac2cab4583f4 context theorem is optional
haftmann
parents: 34944
diff changeset
    89
           of SOME app => print_app tyvars is_pat some_thm vars fxy app
37639
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
    90
            | _ => applify "(" ")" (print_term tyvars is_pat some_thm vars NOBR) fxy
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
    91
                (print_term tyvars is_pat some_thm vars BR t1) [t2])
35228
ac2cab4583f4 context theorem is optional
haftmann
parents: 34944
diff changeset
    92
      | print_term tyvars is_pat some_thm vars fxy (IVar v) =
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
    93
          print_var vars v
61130
8e736ce4c6f4 unconditional parenthesing of (chained) abstractions in Scala, with explicit regression setup
haftmann
parents: 59323
diff changeset
    94
      | print_term tyvars is_pat some_thm vars fxy (t as _ `|=> _) =
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
    95
          let
61130
8e736ce4c6f4 unconditional parenthesing of (chained) abstractions in Scala, with explicit regression setup
haftmann
parents: 59323
diff changeset
    96
            val (vs_tys, body) = Code_Thingol.unfold_abs t;
8e736ce4c6f4 unconditional parenthesing of (chained) abstractions in Scala, with explicit regression setup
haftmann
parents: 59323
diff changeset
    97
            val (ps, vars') = fold_map (print_abs_head tyvars) vs_tys vars;
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
    98
          in
61130
8e736ce4c6f4 unconditional parenthesing of (chained) abstractions in Scala, with explicit regression setup
haftmann
parents: 59323
diff changeset
    99
            brackets (ps @| print_term tyvars false some_thm vars' NOBR body)
41939
wenzelm
parents: 41784
diff changeset
   100
          end
48072
ace701efe203 prefer records with speaking labels over deeply nested tuples
haftmann
parents: 48003
diff changeset
   101
      | print_term tyvars is_pat some_thm vars fxy (ICase case_expr) =
ace701efe203 prefer records with speaking labels over deeply nested tuples
haftmann
parents: 48003
diff changeset
   102
          (case Code_Thingol.unfold_const_app (#primitive case_expr)
55150
0940309ed8f1 less clumsy namespace
haftmann
parents: 55147
diff changeset
   103
           of SOME (app as ({ sym = Constant const, ... }, _)) =>
55147
bce3dbc11f95 prefer explicit code symbol type over ad-hoc name mangling
haftmann
parents: 55145
diff changeset
   104
                if is_none (const_syntax const)
48072
ace701efe203 prefer records with speaking labels over deeply nested tuples
haftmann
parents: 48003
diff changeset
   105
                then print_case tyvars some_thm vars fxy case_expr
ace701efe203 prefer records with speaking labels over deeply nested tuples
haftmann
parents: 48003
diff changeset
   106
                else print_app tyvars is_pat some_thm vars fxy app
ace701efe203 prefer records with speaking labels over deeply nested tuples
haftmann
parents: 48003
diff changeset
   107
            | NONE => print_case tyvars some_thm vars fxy case_expr)
61130
8e736ce4c6f4 unconditional parenthesing of (chained) abstractions in Scala, with explicit regression setup
haftmann
parents: 59323
diff changeset
   108
    and print_abs_head tyvars (some_v, ty) vars =
8e736ce4c6f4 unconditional parenthesing of (chained) abstractions in Scala, with explicit regression setup
haftmann
parents: 59323
diff changeset
   109
           let
8e736ce4c6f4 unconditional parenthesing of (chained) abstractions in Scala, with explicit regression setup
haftmann
parents: 59323
diff changeset
   110
             val vars' = intro_vars (the_list some_v) vars;
8e736ce4c6f4 unconditional parenthesing of (chained) abstractions in Scala, with explicit regression setup
haftmann
parents: 59323
diff changeset
   111
           in
8e736ce4c6f4 unconditional parenthesing of (chained) abstractions in Scala, with explicit regression setup
haftmann
parents: 59323
diff changeset
   112
             (concat [
8e736ce4c6f4 unconditional parenthesing of (chained) abstractions in Scala, with explicit regression setup
haftmann
parents: 59323
diff changeset
   113
               enclose "(" ")" [constraint (print_var vars' some_v) (print_typ tyvars NOBR ty)],
8e736ce4c6f4 unconditional parenthesing of (chained) abstractions in Scala, with explicit regression setup
haftmann
parents: 59323
diff changeset
   114
               str "=>"
8e736ce4c6f4 unconditional parenthesing of (chained) abstractions in Scala, with explicit regression setup
haftmann
parents: 59323
diff changeset
   115
             ], vars')
8e736ce4c6f4 unconditional parenthesing of (chained) abstractions in Scala, with explicit regression setup
haftmann
parents: 59323
diff changeset
   116
           end
37464
9250ad1b98e0 tuned whitespace; dropped dead code
haftmann
parents: 37453
diff changeset
   117
    and print_app tyvars is_pat some_thm vars fxy
77703
0262155d2743 more uniform approach towards satisfied applications
haftmann
parents: 77232
diff changeset
   118
        (app as (const as { sym, typargs, dom, dicts, ... }, ts)) =
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   119
      let
50626
e21485358c56 uniform parentheses for constructor -- necessary to accomodate scala 10
haftmann
parents: 48568
diff changeset
   120
        val typargs' = if is_pat then [] else typargs;
55147
bce3dbc11f95 prefer explicit code symbol type over ad-hoc name mangling
haftmann
parents: 55145
diff changeset
   121
        val syntax = case sym of
55150
0940309ed8f1 less clumsy namespace
haftmann
parents: 55147
diff changeset
   122
            Constant const => const_syntax const
55147
bce3dbc11f95 prefer explicit code symbol type over ad-hoc name mangling
haftmann
parents: 55145
diff changeset
   123
          | _ => NONE;
63303
7cffe366d333 explicit resolution of ambiguous dictionaries
haftmann
parents: 61130
diff changeset
   124
        val applify_dicts =
7cffe366d333 explicit resolution of ambiguous dictionaries
haftmann
parents: 61130
diff changeset
   125
          if is_pat orelse is_some syntax orelse is_constr sym
7cffe366d333 explicit resolution of ambiguous dictionaries
haftmann
parents: 61130
diff changeset
   126
            orelse Code_Thingol.unambiguous_dictss dicts
7cffe366d333 explicit resolution of ambiguous dictionaries
haftmann
parents: 61130
diff changeset
   127
          then fn p => K p
7cffe366d333 explicit resolution of ambiguous dictionaries
haftmann
parents: 61130
diff changeset
   128
          else applify_dictss tyvars;
77232
6cad6ed2700a somehow more clear terminology
haftmann
parents: 75649
diff changeset
   129
        val (wanted, print') = case syntax of
63303
7cffe366d333 explicit resolution of ambiguous dictionaries
haftmann
parents: 61130
diff changeset
   130
            NONE => (args_num sym, fn fxy => fn ts => applify_dicts
7cffe366d333 explicit resolution of ambiguous dictionaries
haftmann
parents: 61130
diff changeset
   131
              (gen_applify (is_constr sym) "(" ")"
37639
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   132
              (print_term tyvars is_pat some_thm vars NOBR) fxy
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   133
                (applify "[" "]" (print_typ tyvars NOBR)
63303
7cffe366d333 explicit resolution of ambiguous dictionaries
haftmann
parents: 61130
diff changeset
   134
                  NOBR ((str o deresolve) sym) typargs') ts) dicts)
7cffe366d333 explicit resolution of ambiguous dictionaries
haftmann
parents: 61130
diff changeset
   135
          | SOME (k, Plain_printer s) => (k, fn fxy => fn ts => applify_dicts
7cffe366d333 explicit resolution of ambiguous dictionaries
haftmann
parents: 61130
diff changeset
   136
              (applify "(" ")"
37881
096c8397c989 distinguish different classes of const syntax
haftmann
parents: 37822
diff changeset
   137
              (print_term tyvars is_pat some_thm vars NOBR) fxy
096c8397c989 distinguish different classes of const syntax
haftmann
parents: 37822
diff changeset
   138
                (applify "[" "]" (print_typ tyvars NOBR)
63303
7cffe366d333 explicit resolution of ambiguous dictionaries
haftmann
parents: 61130
diff changeset
   139
                  NOBR (str s) typargs') ts) dicts)
55153
eedd549de3ef more suitable names, without any notion of "activating"
haftmann
parents: 55150
diff changeset
   140
          | SOME (k, Complex_printer print) =>
38059
72f4630d4c43 tuned printing of applications and let cascades
haftmann
parents: 37958
diff changeset
   141
              (k, fn fxy => fn ts => print (print_term tyvars is_pat some_thm) some_thm vars fxy
48072
ace701efe203 prefer records with speaking labels over deeply nested tuples
haftmann
parents: 48003
diff changeset
   142
                (ts ~~ take k dom))
77703
0262155d2743 more uniform approach towards satisfied applications
haftmann
parents: 77232
diff changeset
   143
        val ((vs_tys, (ts1, rty)), ts2) =
0262155d2743 more uniform approach towards satisfied applications
haftmann
parents: 77232
diff changeset
   144
          Code_Thingol.satisfied_application wanted app;
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   145
      in
77703
0262155d2743 more uniform approach towards satisfied applications
haftmann
parents: 77232
diff changeset
   146
        if null vs_tys then
0262155d2743 more uniform approach towards satisfied applications
haftmann
parents: 77232
diff changeset
   147
          if null ts2 then
0262155d2743 more uniform approach towards satisfied applications
haftmann
parents: 77232
diff changeset
   148
            print' fxy ts
0262155d2743 more uniform approach towards satisfied applications
haftmann
parents: 77232
diff changeset
   149
          else
0262155d2743 more uniform approach towards satisfied applications
haftmann
parents: 77232
diff changeset
   150
            Pretty.block (print' BR ts1 :: map (fn t => Pretty.block
0262155d2743 more uniform approach towards satisfied applications
haftmann
parents: 77232
diff changeset
   151
              [str ".apply(", print_term tyvars is_pat some_thm vars NOBR t, str ")"]) ts2)
0262155d2743 more uniform approach towards satisfied applications
haftmann
parents: 77232
diff changeset
   152
        else
0262155d2743 more uniform approach towards satisfied applications
haftmann
parents: 77232
diff changeset
   153
          print_term tyvars is_pat some_thm vars fxy (vs_tys `|==> (IConst const `$$ ts1, rty))
0262155d2743 more uniform approach towards satisfied applications
haftmann
parents: 77232
diff changeset
   154
      end
37464
9250ad1b98e0 tuned whitespace; dropped dead code
haftmann
parents: 37453
diff changeset
   155
    and print_bind tyvars some_thm fxy p =
9250ad1b98e0 tuned whitespace; dropped dead code
haftmann
parents: 37453
diff changeset
   156
      gen_print_bind (print_term tyvars true) some_thm fxy p
48072
ace701efe203 prefer records with speaking labels over deeply nested tuples
haftmann
parents: 48003
diff changeset
   157
    and print_case tyvars some_thm vars fxy { clauses = [], ... } =
48073
1b609a7837ef prefer sys.error over plain error in Scala to avoid deprecation warning
haftmann
parents: 48072
diff changeset
   158
          (brackify fxy o Pretty.breaks o map str) ["sys.error(\"empty case\")"]
48072
ace701efe203 prefer records with speaking labels over deeply nested tuples
haftmann
parents: 48003
diff changeset
   159
      | print_case tyvars some_thm vars fxy (case_expr as { clauses = [_], ... }) =
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   160
          let
48072
ace701efe203 prefer records with speaking labels over deeply nested tuples
haftmann
parents: 48003
diff changeset
   161
            val (bind :: binds, body) = Code_Thingol.unfold_let (ICase case_expr);
41781
32a7726d2136 more idiomatic printing of let cascades and type variable constraints
haftmann
parents: 41687
diff changeset
   162
            fun print_match_val ((pat, ty), t) vars =
32a7726d2136 more idiomatic printing of let cascades and type variable constraints
haftmann
parents: 41687
diff changeset
   163
              vars
32a7726d2136 more idiomatic printing of let cascades and type variable constraints
haftmann
parents: 41687
diff changeset
   164
              |> print_bind tyvars some_thm BR pat
75401
010a77180dff adjusted printing of type annotations to accomodate Scala 3
haftmann
parents: 75356
diff changeset
   165
              |>> (fn p => (false, concat [str "val", p, str "=",
75649
7afb6628ab86 corrections and adjustions for Scala 3
haftmann
parents: 75643
diff changeset
   166
                constraint (print_term tyvars false some_thm vars NOBR t) (print_typ tyvars BR ty)]));
41781
32a7726d2136 more idiomatic printing of let cascades and type variable constraints
haftmann
parents: 41687
diff changeset
   167
            fun print_match_seq t vars =
32a7726d2136 more idiomatic printing of let cascades and type variable constraints
haftmann
parents: 41687
diff changeset
   168
              ((true, print_term tyvars false some_thm vars NOBR t), vars);
32a7726d2136 more idiomatic printing of let cascades and type variable constraints
haftmann
parents: 41687
diff changeset
   169
            fun print_match is_first ((IVar NONE, ty), t) =
41784
537013b8ba8e dropped redundancy
haftmann
parents: 41781
diff changeset
   170
                  if Code_Thingol.is_IAbs t andalso is_first
41781
32a7726d2136 more idiomatic printing of let cascades and type variable constraints
haftmann
parents: 41687
diff changeset
   171
                    then print_match_val ((IVar NONE, ty), t)
32a7726d2136 more idiomatic printing of let cascades and type variable constraints
haftmann
parents: 41687
diff changeset
   172
                    else print_match_seq t
32a7726d2136 more idiomatic printing of let cascades and type variable constraints
haftmann
parents: 41687
diff changeset
   173
              | print_match _ ((pat, ty), t) =
32a7726d2136 more idiomatic printing of let cascades and type variable constraints
haftmann
parents: 41687
diff changeset
   174
                  print_match_val ((pat, ty), t);
32a7726d2136 more idiomatic printing of let cascades and type variable constraints
haftmann
parents: 41687
diff changeset
   175
            val (seps_ps, vars') =
32a7726d2136 more idiomatic printing of let cascades and type variable constraints
haftmann
parents: 41687
diff changeset
   176
              vars |> print_match true bind ||>> fold_map (print_match false) binds |>> uncurry cons;
38059
72f4630d4c43 tuned printing of applications and let cascades
haftmann
parents: 37958
diff changeset
   177
            val all_seps_ps = seps_ps @ [(true, print_term tyvars false some_thm vars' NOBR body)];
72f4630d4c43 tuned printing of applications and let cascades
haftmann
parents: 37958
diff changeset
   178
            fun insert_seps [(_, p)] = [p]
72f4630d4c43 tuned printing of applications and let cascades
haftmann
parents: 37958
diff changeset
   179
              | insert_seps ((_, p) :: (seps_ps as (sep, _) :: _)) =
72f4630d4c43 tuned printing of applications and let cascades
haftmann
parents: 37958
diff changeset
   180
                  (if sep then Pretty.block [p, str ";"] else p) :: insert_seps seps_ps
41781
32a7726d2136 more idiomatic printing of let cascades and type variable constraints
haftmann
parents: 41687
diff changeset
   181
          in brackify_block fxy (str "{") (insert_seps all_seps_ps) (str "}") end
48072
ace701efe203 prefer records with speaking labels over deeply nested tuples
haftmann
parents: 48003
diff changeset
   182
      | print_case tyvars some_thm vars fxy { term = t, typ = ty, clauses = clauses as _ :: _, ... } =
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   183
          let
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   184
            fun print_select (pat, body) =
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   185
              let
37464
9250ad1b98e0 tuned whitespace; dropped dead code
haftmann
parents: 37453
diff changeset
   186
                val (p_pat, vars') = print_bind tyvars some_thm NOBR pat vars;
9250ad1b98e0 tuned whitespace; dropped dead code
haftmann
parents: 37453
diff changeset
   187
                val p_body = print_term tyvars false some_thm vars' NOBR body
9250ad1b98e0 tuned whitespace; dropped dead code
haftmann
parents: 37453
diff changeset
   188
              in concat [str "case", p_pat, str "=>", p_body] end;
46850
7b04cfc24eb6 always bracket case expressions in Scala
haftmann
parents: 45009
diff changeset
   189
          in
7b04cfc24eb6 always bracket case expressions in Scala
haftmann
parents: 45009
diff changeset
   190
            map print_select clauses
80086
1b986e5f9764 adjust generated Scala to make it work with scalac -old-syntax and -new-syntax, although the latter is not regularly tested;
wenzelm
parents: 78594
diff changeset
   191
            |> Pretty.block_enclose (concat [print_term tyvars false some_thm vars NOBR t, str "match {"], str "}")
46850
7b04cfc24eb6 always bracket case expressions in Scala
haftmann
parents: 45009
diff changeset
   192
            |> single
7b04cfc24eb6 always bracket case expressions in Scala
haftmann
parents: 45009
diff changeset
   193
            |> enclose "(" ")"
48072
ace701efe203 prefer records with speaking labels over deeply nested tuples
haftmann
parents: 48003
diff changeset
   194
          end;
63350
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   195
    fun print_context tyvars vs s = applify "[" "]"
37639
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   196
      (fn (v, sort) => (Pretty.block o map str)
55147
bce3dbc11f95 prefer explicit code symbol type over ad-hoc name mangling
haftmann
parents: 55145
diff changeset
   197
        (lookup_tyvar tyvars v :: maps (fn class => [" : ", deresolve_class class]) sort))
63350
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   198
          NOBR (str s) vs;
66326
haftmann
parents: 65531
diff changeset
   199
    fun print_defhead tyvars vars const vs params tys ty =
55776
7dd1971b39c1 amended some slips, rolling back currently dysfunctional export minimimalisation for Scala
haftmann
parents: 55684
diff changeset
   200
      concat [str "def", constraint (applify "(" ")" (fn (param, ty) =>
37639
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   201
        constraint ((str o lookup_var vars) param) (print_typ tyvars NOBR ty))
63350
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   202
          NOBR (print_context tyvars vs (deresolve_const const)) (params ~~ tys)) (print_typ tyvars NOBR ty),
55679
59244fc1a7ca formal markup for public ingredients
haftmann
parents: 55153
diff changeset
   203
            str "="];
66326
haftmann
parents: 65531
diff changeset
   204
    fun print_def const (vs, ty) [] =
37639
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   205
          let
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   206
            val (tys, ty') = Code_Thingol.unfold_fun ty;
43329
84472e198515 tuned signature: Name.invent and Name.invent_names;
wenzelm
parents: 43326
diff changeset
   207
            val params = Name.invent (snd reserved) "a" (length tys);
37639
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   208
            val tyvars = intro_tyvars vs reserved;
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   209
            val vars = intro_vars params reserved;
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   210
          in
66326
haftmann
parents: 65531
diff changeset
   211
            concat [print_defhead tyvars vars const vs params tys ty',
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67496
diff changeset
   212
              str ("sys.error(" ^ print_scala_string const ^ ")")]
37639
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   213
          end
66326
haftmann
parents: 65531
diff changeset
   214
      | print_def const (vs, ty) eqs =
37639
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   215
          let
75353
05f7f5454cb6 prefer build combinator
haftmann
parents: 72511
diff changeset
   216
            val tycos = build (fold (fn ((ts, t), _) =>
05f7f5454cb6 prefer build combinator
haftmann
parents: 72511
diff changeset
   217
              fold Code_Thingol.add_tyconames (t :: ts)) eqs);
37639
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   218
            val tyvars = reserved
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   219
              |> intro_base_names
55147
bce3dbc11f95 prefer explicit code symbol type over ad-hoc name mangling
haftmann
parents: 55145
diff changeset
   220
                   (is_none o tyco_syntax) deresolve_tyco tycos
37639
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   221
              |> intro_tyvars vs;
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   222
            val simple = case eqs
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   223
             of [((ts, _), _)] => forall Code_Thingol.is_IVar ts
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   224
              | _ => false;
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   225
            val vars1 = reserved
55145
2bb3cd36bcf7 more abstract declaration of unqualified constant names in code printing context
haftmann
parents: 52520
diff changeset
   226
              |> intro_base_names_for (is_none o const_syntax)
2bb3cd36bcf7 more abstract declaration of unqualified constant names in code printing context
haftmann
parents: 52520
diff changeset
   227
                   deresolve (map (snd o fst) eqs);
37639
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   228
            val params = if simple
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   229
              then (map (fn IVar (SOME x) => x) o fst o fst o hd) eqs
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   230
              else aux_params vars1 (map (fst o fst) eqs);
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   231
            val vars2 = intro_vars params vars1;
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   232
            val (tys', ty') = Code_Thingol.unfold_fun_n (length params) ty;
38922
ec2a8efd8990 Code_Printer.tuplify
haftmann
parents: 38916
diff changeset
   233
            fun tuplify [p] = p
ec2a8efd8990 Code_Printer.tuplify
haftmann
parents: 38916
diff changeset
   234
              | tuplify ps = enum "," "(" ")" ps;
37639
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   235
            fun print_rhs vars' ((_, t), (some_thm, _)) =
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   236
              print_term tyvars false some_thm vars' NOBR t;
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   237
            fun print_clause (eq as ((ts, _), (some_thm, _))) =
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   238
              let
75356
fa014f31f208 modernized handling of variables
haftmann
parents: 75353
diff changeset
   239
                val vars' =
fa014f31f208 modernized handling of variables
haftmann
parents: 75353
diff changeset
   240
                  intro_vars (build (fold Code_Thingol.add_varnames ts)) vars1;
37639
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   241
              in
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   242
                concat [str "case",
38922
ec2a8efd8990 Code_Printer.tuplify
haftmann
parents: 38916
diff changeset
   243
                  tuplify (map (print_term tyvars true some_thm vars' NOBR) ts),
37639
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   244
                  str "=>", print_rhs vars' eq]
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   245
              end;
66326
haftmann
parents: 65531
diff changeset
   246
            val head = print_defhead tyvars vars2 const vs params tys' ty';
37639
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   247
          in if simple then
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   248
            concat [head, print_rhs vars2 (hd eqs)]
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   249
          else
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   250
            Pretty.block_enclose
38922
ec2a8efd8990 Code_Printer.tuplify
haftmann
parents: 38916
diff changeset
   251
              (concat [head, tuplify (map (str o lookup_var vars2) params),
80086
1b986e5f9764 adjust generated Scala to make it work with scalac -old-syntax and -new-syntax, although the latter is not regularly tested;
wenzelm
parents: 78594
diff changeset
   252
                str "match {"], str "}")
37639
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   253
              (map print_clause eqs)
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   254
          end;
55150
0940309ed8f1 less clumsy namespace
haftmann
parents: 55147
diff changeset
   255
    val print_method = str o Library.enclose "`" "`" o deresolve_full o Constant;
63350
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   256
    fun print_inst class (tyco, { vs, inst_params, superinst_params }) =
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   257
      let
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   258
        val tyvars = intro_tyvars vs reserved;
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   259
        val classtyp = (class, tyco `%% map (ITyVar o fst) vs);
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   260
        fun print_classparam_instance ((classparam, (const as { dom, ... }, dom_length)), (thm, _)) =
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   261
          let
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   262
            val aux_dom = Name.invent_names (snd reserved) "a" dom;
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   263
            val auxs = map fst aux_dom;
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   264
            val vars = intro_vars auxs reserved;
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   265
            val (aux_dom1, aux_dom2) = chop dom_length aux_dom;
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   266
            fun abstract_using [] = []
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   267
              | abstract_using aux_dom = [enum "," "(" ")"
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   268
                  (map (fn (aux, ty) => constraint ((str o lookup_var vars) aux)
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   269
                  (print_typ tyvars NOBR ty)) aux_dom), str "=>"];
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   270
            val aux_abstr1 = abstract_using aux_dom1;
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   271
            val aux_abstr2 = abstract_using aux_dom2;
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   272
          in
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   273
            concat ([str "val", print_method classparam, str "="]
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   274
              @ aux_abstr1 @ aux_abstr2 @| print_app tyvars false (SOME thm) vars NOBR
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   275
                (const, map (IVar o SOME) auxs))
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   276
          end;
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   277
      in
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   278
        Pretty.block_enclose (concat [str "implicit def",
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   279
          constraint (print_context tyvars vs
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   280
            ((Library.enclose "`" "`" o deresolve_full o Class_Instance) (tyco, class)))
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   281
          (print_dicttyp tyvars classtyp),
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   282
          str "=", str "new", print_dicttyp tyvars classtyp, str "{"], str "}")
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   283
            (map print_classparam_instance (inst_params @ superinst_params))
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   284
      end;
66326
haftmann
parents: 65531
diff changeset
   285
    fun print_stmt (Constant const, (_, Fun ((vs, ty), raw_eqs))) =
haftmann
parents: 65531
diff changeset
   286
          print_def const (vs, ty) (filter (snd o snd) raw_eqs)
haftmann
parents: 65531
diff changeset
   287
      | print_stmt (Type_Constructor tyco, (_, Datatype (vs, cos))) =
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   288
          let
48003
1d11af40b106 dropped sort constraints on datatype specifications
haftmann
parents: 47609
diff changeset
   289
            val tyvars = intro_tyvars (map (rpair []) vs) reserved;
50626
e21485358c56 uniform parentheses for constructor -- necessary to accomodate scala 10
haftmann
parents: 48568
diff changeset
   290
            fun print_co ((co, vs_args), tys) =
e21485358c56 uniform parentheses for constructor -- necessary to accomodate scala 10
haftmann
parents: 48568
diff changeset
   291
              concat [Pretty.block ((applify "[" "]" (str o lookup_tyvar tyvars) NOBR
72295
aafec95bc30e more robust: avoid spurious line breaks that might confuse the scala interpreter;
wenzelm
parents: 69623
diff changeset
   292
                (str ("final case class " ^ deresolve_const co)) vs_args)
50626
e21485358c56 uniform parentheses for constructor -- necessary to accomodate scala 10
haftmann
parents: 48568
diff changeset
   293
                @@ enum "," "(" ")" (map (fn (v, arg) => constraint (str v) (print_typ tyvars NOBR arg))
e21485358c56 uniform parentheses for constructor -- necessary to accomodate scala 10
haftmann
parents: 48568
diff changeset
   294
                  (Name.invent_names (snd reserved) "a" tys))),
e21485358c56 uniform parentheses for constructor -- necessary to accomodate scala 10
haftmann
parents: 48568
diff changeset
   295
                str "extends",
e21485358c56 uniform parentheses for constructor -- necessary to accomodate scala 10
haftmann
parents: 48568
diff changeset
   296
                applify "[" "]" (str o lookup_tyvar tyvars) NOBR
55147
bce3dbc11f95 prefer explicit code symbol type over ad-hoc name mangling
haftmann
parents: 55145
diff changeset
   297
                  ((str o deresolve_tyco) tyco) vs
50626
e21485358c56 uniform parentheses for constructor -- necessary to accomodate scala 10
haftmann
parents: 48568
diff changeset
   298
              ];
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   299
          in
50626
e21485358c56 uniform parentheses for constructor -- necessary to accomodate scala 10
haftmann
parents: 48568
diff changeset
   300
            Pretty.chunks (applify "[" "]" (str o lookup_tyvar tyvars)
72295
aafec95bc30e more robust: avoid spurious line breaks that might confuse the scala interpreter;
wenzelm
parents: 69623
diff changeset
   301
              NOBR (str ("abstract sealed class " ^ deresolve_tyco tyco)) vs
37639
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   302
                :: map print_co cos)
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   303
          end
66326
haftmann
parents: 65531
diff changeset
   304
      | print_stmt (Type_Class class, (_, Class ((v, (classrels, classparams)), insts))) =
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   305
          let
55147
bce3dbc11f95 prefer explicit code symbol type over ad-hoc name mangling
haftmann
parents: 55145
diff changeset
   306
            val tyvars = intro_tyvars [(v, [class])] reserved;
37639
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   307
            fun add_typarg s = Pretty.block
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   308
              [str s, str "[", (str o lookup_tyvar tyvars) v, str "]"];
37384
5aba26803073 more consistent naming aroud type classes and instances
haftmann
parents: 37337
diff changeset
   309
            fun print_super_classes [] = NONE
55147
bce3dbc11f95 prefer explicit code symbol type over ad-hoc name mangling
haftmann
parents: 55145
diff changeset
   310
              | print_super_classes classrels = SOME (concat (str "extends"
bce3dbc11f95 prefer explicit code symbol type over ad-hoc name mangling
haftmann
parents: 55145
diff changeset
   311
                  :: separate (str "with") (map (add_typarg o deresolve_class o snd) classrels)));
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   312
            fun print_classparam_val (classparam, ty) =
37639
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   313
              concat [str "val", constraint (print_method classparam)
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   314
                ((print_tupled_typ tyvars o Code_Thingol.unfold_fun) ty)];
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   315
            fun print_classparam_def (classparam, ty) =
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   316
              let
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   317
                val (tys, ty) = Code_Thingol.unfold_fun ty;
43329
84472e198515 tuned signature: Name.invent and Name.invent_names;
wenzelm
parents: 43326
diff changeset
   318
                val [implicit_name] = Name.invent (snd reserved) (lookup_tyvar tyvars v) 1;
37639
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   319
                val proto_vars = intro_vars [implicit_name] reserved;
43329
84472e198515 tuned signature: Name.invent and Name.invent_names;
wenzelm
parents: 43326
diff changeset
   320
                val auxs = Name.invent (snd proto_vars) "a" (length tys);
37639
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   321
                val vars = intro_vars auxs proto_vars;
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   322
              in
55776
7dd1971b39c1 amended some slips, rolling back currently dysfunctional export minimimalisation for Scala
haftmann
parents: 55684
diff changeset
   323
                concat [str "def", constraint (Pretty.block [applify "(" ")"
37639
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   324
                  (fn (aux, ty) => constraint ((str o lookup_var vars) aux)
55147
bce3dbc11f95 prefer explicit code symbol type over ad-hoc name mangling
haftmann
parents: 55145
diff changeset
   325
                  (print_typ tyvars NOBR ty)) NOBR (add_typarg (deresolve_const classparam))
37639
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   326
                  (auxs ~~ tys), str "(implicit ", str implicit_name, str ": ",
55147
bce3dbc11f95 prefer explicit code symbol type over ad-hoc name mangling
haftmann
parents: 55145
diff changeset
   327
                  add_typarg (deresolve_class class), str ")"]) (print_typ tyvars NOBR ty), str "=",
37639
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   328
                  applify "(" ")" (str o lookup_var vars) NOBR
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   329
                  (Pretty.block [str implicit_name, str ".", print_method classparam]) auxs]
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   330
              end;
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   331
          in
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   332
            Pretty.chunks (
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   333
              (Pretty.block_enclose
55776
7dd1971b39c1 amended some slips, rolling back currently dysfunctional export minimimalisation for Scala
haftmann
parents: 55684
diff changeset
   334
                (concat ([str "trait", (add_typarg o deresolve_class) class]
55147
bce3dbc11f95 prefer explicit code symbol type over ad-hoc name mangling
haftmann
parents: 55145
diff changeset
   335
                  @ the_list (print_super_classes classrels) @ [str "{"]), str "}")
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   336
                (map print_classparam_val classparams))
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   337
              :: map print_classparam_def classparams
63350
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   338
              @| Pretty.block_enclose
75649
7afb6628ab86 corrections and adjustions for Scala 3
haftmann
parents: 75643
diff changeset
   339
                (str ("object " ^ deresolve_class class ^ " {"), str "}")
63350
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   340
                (map (print_inst class) insts)
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   341
            )
37639
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   342
          end;
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   343
  in print_stmt end;
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   344
63350
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   345
fun pickup_instances_for_class program =
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   346
  let
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   347
    val tab =
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   348
      Symtab.empty
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   349
      |> Code_Symbol.Graph.fold
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   350
        (fn (_, (Code_Thingol.Classinst { class, tyco, vs, inst_params, superinst_params, ... }, _)) =>
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   351
              Symtab.map_default (class, [])
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   352
                (cons (tyco, { vs = vs, inst_params = inst_params, superinst_params = superinst_params }))
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   353
           | _ => I) program;
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   354
  in Symtab.lookup_list tab end;
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   355
67207
ad538f6c5d2f dedicated case option for code generation to Scala
haftmann
parents: 66327
diff changeset
   356
fun scala_program_of_program ctxt case_insensitive module_name reserved identifiers exports program =
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   357
  let
67207
ad538f6c5d2f dedicated case option for code generation to Scala
haftmann
parents: 66327
diff changeset
   358
    val variant = if case_insensitive
58520
a4d1f8041af0 accomplish potentially case-insenstive file systems for Scala
haftmann
parents: 58398
diff changeset
   359
      then Code_Namespace.variant_case_insensitive
a4d1f8041af0 accomplish potentially case-insenstive file systems for Scala
haftmann
parents: 58398
diff changeset
   360
      else Name.variant;
38809
7dc73a208722 proper namespace administration for hierarchical modules
haftmann
parents: 38782
diff changeset
   361
    fun namify_module name_fragment ((nsp_class, nsp_object), nsp_common) =
7dc73a208722 proper namespace administration for hierarchical modules
haftmann
parents: 38782
diff changeset
   362
      let
7dc73a208722 proper namespace administration for hierarchical modules
haftmann
parents: 38782
diff changeset
   363
        val declare = Name.declare name_fragment;
7dc73a208722 proper namespace administration for hierarchical modules
haftmann
parents: 38782
diff changeset
   364
      in (name_fragment, ((declare nsp_class, declare nsp_object), declare nsp_common)) end;
38769
317e64c886d2 preliminary implementation of hierarchical module name space
haftmann
parents: 38059
diff changeset
   365
    fun namify_class base ((nsp_class, nsp_object), nsp_common) =
317e64c886d2 preliminary implementation of hierarchical module name space
haftmann
parents: 38059
diff changeset
   366
      let
58520
a4d1f8041af0 accomplish potentially case-insenstive file systems for Scala
haftmann
parents: 58398
diff changeset
   367
        val (base', nsp_class') = variant base nsp_class
38769
317e64c886d2 preliminary implementation of hierarchical module name space
haftmann
parents: 38059
diff changeset
   368
      in (base', ((nsp_class', nsp_object), Name.declare base' nsp_common)) end;
317e64c886d2 preliminary implementation of hierarchical module name space
haftmann
parents: 38059
diff changeset
   369
    fun namify_object base ((nsp_class, nsp_object), nsp_common) =
317e64c886d2 preliminary implementation of hierarchical module name space
haftmann
parents: 38059
diff changeset
   370
      let
58520
a4d1f8041af0 accomplish potentially case-insenstive file systems for Scala
haftmann
parents: 58398
diff changeset
   371
        val (base', nsp_object') = variant base nsp_object
38769
317e64c886d2 preliminary implementation of hierarchical module name space
haftmann
parents: 38059
diff changeset
   372
      in (base', ((nsp_class, nsp_object'), Name.declare base' nsp_common)) end;
56826
ba18bd41e510 enforce case of identifiers only to accomodate strict language requirements (or clear separation of constructors from variables in the case of SML)
haftmann
parents: 56812
diff changeset
   373
    fun namify_common base ((nsp_class, nsp_object), nsp_common) =
38769
317e64c886d2 preliminary implementation of hierarchical module name space
haftmann
parents: 38059
diff changeset
   374
      let
58520
a4d1f8041af0 accomplish potentially case-insenstive file systems for Scala
haftmann
parents: 58398
diff changeset
   375
        val (base', nsp_common') = variant base nsp_common
38769
317e64c886d2 preliminary implementation of hierarchical module name space
haftmann
parents: 38059
diff changeset
   376
      in
56826
ba18bd41e510 enforce case of identifiers only to accomodate strict language requirements (or clear separation of constructors from variables in the case of SML)
haftmann
parents: 56812
diff changeset
   377
        (base', ((Name.declare base' nsp_class, Name.declare base' nsp_object), nsp_common'))
38769
317e64c886d2 preliminary implementation of hierarchical module name space
haftmann
parents: 38059
diff changeset
   378
      end;
38809
7dc73a208722 proper namespace administration for hierarchical modules
haftmann
parents: 38782
diff changeset
   379
    fun namify_stmt (Code_Thingol.Fun _) = namify_object
7dc73a208722 proper namespace administration for hierarchical modules
haftmann
parents: 38782
diff changeset
   380
      | namify_stmt (Code_Thingol.Datatype _) = namify_class
56826
ba18bd41e510 enforce case of identifiers only to accomodate strict language requirements (or clear separation of constructors from variables in the case of SML)
haftmann
parents: 56812
diff changeset
   381
      | namify_stmt (Code_Thingol.Datatypecons _) = namify_common
38809
7dc73a208722 proper namespace administration for hierarchical modules
haftmann
parents: 38782
diff changeset
   382
      | namify_stmt (Code_Thingol.Class _) = namify_class
7dc73a208722 proper namespace administration for hierarchical modules
haftmann
parents: 38782
diff changeset
   383
      | namify_stmt (Code_Thingol.Classrel _) = namify_object
7dc73a208722 proper namespace administration for hierarchical modules
haftmann
parents: 38782
diff changeset
   384
      | namify_stmt (Code_Thingol.Classparam _) = namify_object
56826
ba18bd41e510 enforce case of identifiers only to accomodate strict language requirements (or clear separation of constructors from variables in the case of SML)
haftmann
parents: 56812
diff changeset
   385
      | namify_stmt (Code_Thingol.Classinst _) = namify_common;
63350
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   386
    val pickup_instances = pickup_instances_for_class program;
55684
ee49b4f7edc8 keep only identifiers public which are explicitly requested or demanded by dependencies
haftmann
parents: 55683
diff changeset
   387
    fun modify_stmt (_, (_, Code_Thingol.Fun (_, SOME _))) = NONE
63350
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   388
      | modify_stmt (_, (export, Code_Thingol.Fun (x, NONE))) = SOME (export, Fun x)
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   389
      | modify_stmt (_, (export, Code_Thingol.Datatype x)) = SOME (export, Datatype x)
55684
ee49b4f7edc8 keep only identifiers public which are explicitly requested or demanded by dependencies
haftmann
parents: 55683
diff changeset
   390
      | modify_stmt (_, (_, Code_Thingol.Datatypecons _)) = NONE
63350
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   391
      | modify_stmt (Type_Class class, (export, Code_Thingol.Class x)) =
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   392
          SOME (export, Class (x, pickup_instances class))
55684
ee49b4f7edc8 keep only identifiers public which are explicitly requested or demanded by dependencies
haftmann
parents: 55683
diff changeset
   393
      | modify_stmt (_, (_, Code_Thingol.Classrel _)) = NONE
ee49b4f7edc8 keep only identifiers public which are explicitly requested or demanded by dependencies
haftmann
parents: 55683
diff changeset
   394
      | modify_stmt (_, (_, Code_Thingol.Classparam _)) = NONE
63350
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   395
      | modify_stmt (_, (_, Code_Thingol.Classinst _)) = NONE
38970
53d1ee3d98b8 factored out generic part of Scala serializer into code_namespace.ML
haftmann
parents: 38966
diff changeset
   396
  in
55147
bce3dbc11f95 prefer explicit code symbol type over ad-hoc name mangling
haftmann
parents: 55145
diff changeset
   397
    Code_Namespace.hierarchical_program ctxt
52138
e21426f244aa bookkeeping and input syntax for exact specification of names of symbols in generated code
haftmann
parents: 51143
diff changeset
   398
      { module_name = module_name, reserved = reserved, identifiers = identifiers,
41939
wenzelm
parents: 41784
diff changeset
   399
        empty_nsp = ((reserved, reserved), reserved), namify_module = namify_module,
55684
ee49b4f7edc8 keep only identifiers public which are explicitly requested or demanded by dependencies
haftmann
parents: 55683
diff changeset
   400
        namify_stmt = namify_stmt, cyclic_modules = true,
63350
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   401
        class_transitive = true, class_relation_public = false, empty_data = (),
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   402
        memorize_data = K I, modify_stmts = map modify_stmt }
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   403
      exports program
38970
53d1ee3d98b8 factored out generic part of Scala serializer into code_namespace.ML
haftmann
parents: 38966
diff changeset
   404
  end;
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   405
67207
ad538f6c5d2f dedicated case option for code generation to Scala
haftmann
parents: 66327
diff changeset
   406
fun serialize_scala case_insensitive ctxt { module_name, reserved_syms, identifiers,
69623
ef02c5e051e5 explicit model concerning files of generated code
haftmann
parents: 68034
diff changeset
   407
    includes, class_syntax, tyco_syntax, const_syntax } program exports =
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   408
  let
38769
317e64c886d2 preliminary implementation of hierarchical module name space
haftmann
parents: 38059
diff changeset
   409
38809
7dc73a208722 proper namespace administration for hierarchical modules
haftmann
parents: 38782
diff changeset
   410
    (* build program *)
39147
3c284a152bd6 printing combinator for hierarchical programs
haftmann
parents: 39102
diff changeset
   411
    val { deresolver, hierarchical_program = scala_program } =
67207
ad538f6c5d2f dedicated case option for code generation to Scala
haftmann
parents: 66327
diff changeset
   412
      scala_program_of_program ctxt case_insensitive module_name (Name.make_context reserved_syms)
55683
5732a55b9232 explicit option for "open" code generation
haftmann
parents: 55681
diff changeset
   413
        identifiers exports program;
38769
317e64c886d2 preliminary implementation of hierarchical module name space
haftmann
parents: 38059
diff changeset
   414
317e64c886d2 preliminary implementation of hierarchical module name space
haftmann
parents: 38059
diff changeset
   415
    (* print statements *)
55150
0940309ed8f1 less clumsy namespace
haftmann
parents: 55147
diff changeset
   416
    fun lookup_constr tyco constr = case Code_Symbol.Graph.get_node program (Type_Constructor tyco)
55147
bce3dbc11f95 prefer explicit code symbol type over ad-hoc name mangling
haftmann
parents: 55145
diff changeset
   417
     of Code_Thingol.Datatype (_, constrs) =>
37639
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   418
          the (AList.lookup (op = o apsnd fst) constrs constr);
55150
0940309ed8f1 less clumsy namespace
haftmann
parents: 55147
diff changeset
   419
    fun classparams_of_class class = case Code_Symbol.Graph.get_node program (Type_Class class)
55147
bce3dbc11f95 prefer explicit code symbol type over ad-hoc name mangling
haftmann
parents: 55145
diff changeset
   420
     of Code_Thingol.Class (_, (_, classparams)) => classparams;
55150
0940309ed8f1 less clumsy namespace
haftmann
parents: 55147
diff changeset
   421
    fun args_num (sym as Constant const) = case Code_Symbol.Graph.get_node program sym
55147
bce3dbc11f95 prefer explicit code symbol type over ad-hoc name mangling
haftmann
parents: 55145
diff changeset
   422
     of Code_Thingol.Fun (((_, ty), []), _) =>
37464
9250ad1b98e0 tuned whitespace; dropped dead code
haftmann
parents: 37453
diff changeset
   423
          (length o fst o Code_Thingol.unfold_fun) ty
55147
bce3dbc11f95 prefer explicit code symbol type over ad-hoc name mangling
haftmann
parents: 55145
diff changeset
   424
      | Code_Thingol.Fun ((_, ((ts, _), _) :: _), _) => length ts
bce3dbc11f95 prefer explicit code symbol type over ad-hoc name mangling
haftmann
parents: 55145
diff changeset
   425
      | Code_Thingol.Datatypecons tyco => length (lookup_constr tyco const)
bce3dbc11f95 prefer explicit code symbol type over ad-hoc name mangling
haftmann
parents: 55145
diff changeset
   426
      | Code_Thingol.Classparam class =>
37639
5b6733e6e033 pervasive tuning of code
haftmann
parents: 37464
diff changeset
   427
          (length o fst o Code_Thingol.unfold_fun o the o AList.lookup (op =)
55147
bce3dbc11f95 prefer explicit code symbol type over ad-hoc name mangling
haftmann
parents: 55145
diff changeset
   428
            (classparams_of_class class)) const;
47609
b3dab1892cda dropped dead code
haftmann
parents: 46850
diff changeset
   429
    fun print_stmt prefix_fragments = print_scala_stmt
39147
3c284a152bd6 printing combinator for hierarchical programs
haftmann
parents: 39102
diff changeset
   430
      tyco_syntax const_syntax (make_vars reserved_syms) args_num
50626
e21485358c56 uniform parentheses for constructor -- necessary to accomodate scala 10
haftmann
parents: 48568
diff changeset
   431
      (Code_Thingol.is_constr program) (deresolver prefix_fragments, deresolver []);
38769
317e64c886d2 preliminary implementation of hierarchical module name space
haftmann
parents: 38059
diff changeset
   432
39147
3c284a152bd6 printing combinator for hierarchical programs
haftmann
parents: 39102
diff changeset
   433
    (* print modules *)
63350
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   434
    fun print_module _ base _ ps = Pretty.chunks2
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   435
      (str ("object " ^ base ^ " {")
705229ed856e compiling implicit instances into companion objects for classes avoids ambiguities
haftmann
parents: 63304
diff changeset
   436
        :: ps @| str ("} /* object " ^ base ^ " */"));
38769
317e64c886d2 preliminary implementation of hierarchical module name space
haftmann
parents: 38059
diff changeset
   437
317e64c886d2 preliminary implementation of hierarchical module name space
haftmann
parents: 38059
diff changeset
   438
    (* serialization *)
39147
3c284a152bd6 printing combinator for hierarchical programs
haftmann
parents: 39102
diff changeset
   439
    val p = Pretty.chunks2 (map snd includes
3c284a152bd6 printing combinator for hierarchical programs
haftmann
parents: 39102
diff changeset
   440
      @ Code_Namespace.print_hierarchical {
3c284a152bd6 printing combinator for hierarchical programs
haftmann
parents: 39102
diff changeset
   441
        print_module = print_module, print_stmt = print_stmt,
3c284a152bd6 printing combinator for hierarchical programs
haftmann
parents: 39102
diff changeset
   442
        lift_markup = I } scala_program);
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   443
  in
69623
ef02c5e051e5 explicit model concerning files of generated code
haftmann
parents: 68034
diff changeset
   444
    (Code_Target.Singleton ("scala", p), try (deresolver []))
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   445
  end;
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   446
38966
68853347ba37 tuned internally and made smlnj happy
haftmann
parents: 38928
diff changeset
   447
val serializer : Code_Target.serializer =
67207
ad538f6c5d2f dedicated case option for code generation to Scala
haftmann
parents: 66327
diff changeset
   448
  Code_Target.parse_args (Scan.optional (Args.$$$ "case_insensitive" >> K true) false
ad538f6c5d2f dedicated case option for code generation to Scala
haftmann
parents: 66327
diff changeset
   449
    >> (fn case_insensitive => serialize_scala case_insensitive));
38966
68853347ba37 tuned internally and made smlnj happy
haftmann
parents: 38928
diff changeset
   450
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   451
val literals = let
58398
f38717f175d9 simplified and tuned using signed_string_of_int
haftmann
parents: 56826
diff changeset
   452
  fun numeral_scala k =
f38717f175d9 simplified and tuned using signed_string_of_int
haftmann
parents: 56826
diff changeset
   453
    if ~2147483647 < k andalso k <= 2147483647
f38717f175d9 simplified and tuned using signed_string_of_int
haftmann
parents: 56826
diff changeset
   454
    then signed_string_of_int k
f38717f175d9 simplified and tuned using signed_string_of_int
haftmann
parents: 56826
diff changeset
   455
    else quote (signed_string_of_int k)
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   456
in Literals {
68028
1f9f973eed2a proper datatype for 8-bit characters
haftmann
parents: 67496
diff changeset
   457
  literal_string = print_scala_string,
34944
970e1466028d code literals: distinguish numeral classes by different entries
haftmann
parents: 34900
diff changeset
   458
  literal_numeral = fn k => "BigInt(" ^ numeral_scala k ^ ")",
34888
460ec1a99aa2 being more accurate wrt. list syntax
haftmann
parents: 34308
diff changeset
   459
  literal_list = fn [] => str "Nil" | ps => Pretty.block [str "List", enum "," "(" ")" ps],
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   460
  infix_cons = (6, "::")
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   461
} end;
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   462
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   463
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   464
(** Isar setup **)
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   465
59323
468bd3aedfa1 modernized and more uniform style
haftmann
parents: 59104
diff changeset
   466
val _ = Theory.setup
468bd3aedfa1 modernized and more uniform style
haftmann
parents: 59104
diff changeset
   467
  (Code_Target.add_language
38966
68853347ba37 tuned internally and made smlnj happy
haftmann
parents: 38928
diff changeset
   468
    (target, { serializer = serializer, literals = literals,
41939
wenzelm
parents: 41784
diff changeset
   469
      check = { env_var = "SCALA_HOME",
72511
460d743010bc clarified signature: overloaded "+" for Path.append;
wenzelm
parents: 72295
diff changeset
   470
        make_destination = fn p => p + Path.explode "ROOT.scala",
41940
a3b68a7a0e15 allow spaces in executable names;
wenzelm
parents: 41939
diff changeset
   471
        make_command = fn _ =>
67207
ad538f6c5d2f dedicated case option for code generation to Scala
haftmann
parents: 66327
diff changeset
   472
          "isabelle_scala scalac $ISABELLE_SCALAC_OPTIONS ROOT.scala"},
67496
eff8b632bdc6 clarified position;
wenzelm
parents: 67207
diff changeset
   473
      evaluation_args = Token.explode0 Keyword.empty_keywords "case_insensitive"})
55150
0940309ed8f1 less clumsy namespace
haftmann
parents: 55147
diff changeset
   474
  #> Code_Target.set_printings (Type_Constructor ("fun",
52435
6646bb548c6b migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents: 52229
diff changeset
   475
    [(target, SOME (2, fn print_typ => fn fxy => fn [ty1, ty2] =>
6646bb548c6b migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents: 52229
diff changeset
   476
      brackify_infix (1, R) fxy (
6646bb548c6b migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents: 52229
diff changeset
   477
        print_typ BR ty1 (*product type vs. tupled arguments!*),
6646bb548c6b migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents: 52229
diff changeset
   478
        str "=>",
6646bb548c6b migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents: 52229
diff changeset
   479
        print_typ (INFX (1, R)) ty2
6646bb548c6b migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents: 52229
diff changeset
   480
      )))]))
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   481
  #> fold (Code_Target.add_reserved target) [
75643
3c659dfa82f8 more keywords for scala3;
wenzelm
parents: 75401
diff changeset
   482
      "abstract", "case", "catch", "class", "def", "do", "else", "enum", "export", "extends",
3c659dfa82f8 more keywords for scala3;
wenzelm
parents: 75401
diff changeset
   483
      "false", "final", "finally", "for", "forSome", "given", "if", "implicit", "import", "lazy",
3c659dfa82f8 more keywords for scala3;
wenzelm
parents: 75401
diff changeset
   484
      "match", "new", "null", "object", "override", "package", "private", "protected", "requires",
3c659dfa82f8 more keywords for scala3;
wenzelm
parents: 75401
diff changeset
   485
      "return", "sealed", "super", "then", "this", "throw", "trait", "try", "true", "type", "val",
3c659dfa82f8 more keywords for scala3;
wenzelm
parents: 75401
diff changeset
   486
      "var", "while", "with", "yield"
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   487
    ]
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   488
  #> fold (Code_Target.add_reserved target) [
48073
1b609a7837ef prefer sys.error over plain error in Scala to avoid deprecation warning
haftmann
parents: 48072
diff changeset
   489
      "apply", "sys", "scala", "BigInt", "Nil", "List"
59323
468bd3aedfa1 modernized and more uniform style
haftmann
parents: 59104
diff changeset
   490
    ]);
34294
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   491
19c1fd52d6c9 a primitive scala serializer
haftmann
parents:
diff changeset
   492
end; (*struct*)