src/Tools/Code/code_scala.ML
changeset 68028 1f9f973eed2a
parent 67496 eff8b632bdc6
child 68034 27ba50c79328
equal deleted inserted replaced
68027:64559e1ca05b 68028:1f9f973eed2a
    20 infixr 5 @|;
    20 infixr 5 @|;
    21 
    21 
    22 (** Scala serializer **)
    22 (** Scala serializer **)
    23 
    23 
    24 val target = "Scala";
    24 val target = "Scala";
       
    25 
       
    26 val print_scala_string =
       
    27   let
       
    28     fun chr i = "\\u" ^ align_right "0" 4 (Int.fmt StringCvt.HEX i)
       
    29     fun char c = if c = "'" then "\\'"
       
    30       else if c = "\"" then "\\\""
       
    31       else if c = "\\" then "\\\\"
       
    32       else
       
    33         let
       
    34           val i = ord c
       
    35         in
       
    36           if i < 32 orelse i > 126
       
    37           then chr i
       
    38           else if i >= 128
       
    39           then error "non-ASCII byte in Haskell string literal"
       
    40           else c
       
    41         end
       
    42   in quote o translate_string char end;
    25 
    43 
    26 datatype scala_stmt = Fun of typscheme * ((iterm list * iterm) * (thm option * bool)) list
    44 datatype scala_stmt = Fun of typscheme * ((iterm list * iterm) * (thm option * bool)) list
    27   | Datatype of vname list * ((string * vname list) * itype list) list
    45   | Datatype of vname list * ((string * vname list) * itype list) list
    28   | Class of (vname * ((class * class) list * (string * itype) list))
    46   | Class of (vname * ((class * class) list * (string * itype) list))
    29       * (string * { vs: (vname * sort) list,
    47       * (string * { vs: (vname * sort) list,
   187             val params = Name.invent (snd reserved) "a" (length tys);
   205             val params = Name.invent (snd reserved) "a" (length tys);
   188             val tyvars = intro_tyvars vs reserved;
   206             val tyvars = intro_tyvars vs reserved;
   189             val vars = intro_vars params reserved;
   207             val vars = intro_vars params reserved;
   190           in
   208           in
   191             concat [print_defhead tyvars vars const vs params tys ty',
   209             concat [print_defhead tyvars vars const vs params tys ty',
   192               str ("sys.error(\"" ^ const ^ "\")")]
   210               str ("sys.error(" ^ print_scala_string const ^ ")")]
   193           end
   211           end
   194       | print_def const (vs, ty) eqs =
   212       | print_def const (vs, ty) eqs =
   195           let
   213           let
   196             val tycos = fold (fn ((ts, t), _) =>
   214             val tycos = fold (fn ((ts, t), _) =>
   197               fold Code_Thingol.add_tyconames (t :: ts)) eqs [];
   215               fold Code_Thingol.add_tyconames (t :: ts)) eqs [];
   430 val serializer : Code_Target.serializer =
   448 val serializer : Code_Target.serializer =
   431   Code_Target.parse_args (Scan.optional (Args.$$$ "case_insensitive" >> K true) false
   449   Code_Target.parse_args (Scan.optional (Args.$$$ "case_insensitive" >> K true) false
   432     >> (fn case_insensitive => serialize_scala case_insensitive));
   450     >> (fn case_insensitive => serialize_scala case_insensitive));
   433 
   451 
   434 val literals = let
   452 val literals = let
   435   fun char_scala c = if c = "'" then "\\'"
       
   436     else if c = "\"" then "\\\""
       
   437     else if c = "\\" then "\\\\"
       
   438     else let val k = ord c
       
   439     in if k < 32 orelse k > 126
       
   440     then "\\u" ^ align_right "0" 4 (Int.fmt StringCvt.HEX k) else c end
       
   441   fun numeral_scala k =
   453   fun numeral_scala k =
   442     if ~2147483647 < k andalso k <= 2147483647
   454     if ~2147483647 < k andalso k <= 2147483647
   443     then signed_string_of_int k
   455     then signed_string_of_int k
   444     else quote (signed_string_of_int k)
   456     else quote (signed_string_of_int k)
   445 in Literals {
   457 in Literals {
   446   literal_char = Library.enclose "'" "'" o char_scala,
   458   literal_string = print_scala_string,
   447   literal_string = quote o translate_string char_scala,
       
   448   literal_numeral = fn k => "BigInt(" ^ numeral_scala k ^ ")",
   459   literal_numeral = fn k => "BigInt(" ^ numeral_scala k ^ ")",
   449   literal_list = fn [] => str "Nil" | ps => Pretty.block [str "List", enum "," "(" ")" ps],
   460   literal_list = fn [] => str "Nil" | ps => Pretty.block [str "List", enum "," "(" ")" ps],
   450   infix_cons = (6, "::")
   461   infix_cons = (6, "::")
   451 } end;
   462 } end;
   452 
   463