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 |