src/HOL/Library/MLString.thy
author haftmann
Mon, 25 Sep 2006 17:04:15 +0200
changeset 20699 0cc77abb185a
parent 20453 855f07fabd76
child 21079 747d716e98d0
permissions -rw-r--r--
refinements in codegen serializer
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
20400
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
     1
(*  ID:         $Id$
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
     2
    Author:     Florian Haftmann, TU Muenchen
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
     3
*)
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
     4
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
     5
header {* Monolithic strings for ML  *}
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
     6
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
     7
theory MLString
20453
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20439
diff changeset
     8
imports List
20400
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
     9
begin
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    10
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    11
section {* Monolithic strings for ML *}
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    12
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    13
subsection {* Motivation *}
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    14
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    15
text {*
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    16
  Strings are represented in HOL as list of characters.
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    17
  For code generation to Haskell, this is no problem
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    18
  since in Haskell "abc" is equivalent to ['a', 'b', 'c'].
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    19
  On the other hand, in ML all strings have to
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    20
  be represented as list of characters which
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    21
  is awkward to read. This theory provides a distinguished
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    22
  datatype for strings which then by convention
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    23
  are serialized as monolithic ML strings. Note
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    24
  that in Haskell these strings are identified
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    25
  with Haskell strings.
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    26
*}
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    27
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    28
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    29
subsection {* Datatype of monolithic strings *}
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    30
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    31
datatype ml_string = STR string
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    32
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    33
consts
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    34
  explode :: "ml_string \<Rightarrow> string"
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    35
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    36
primrec
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    37
  "explode (STR s) = s"
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    38
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    39
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    40
subsection {* ML interface *}
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    41
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    42
ML {*
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    43
structure MLString =
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    44
struct
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    45
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    46
local
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    47
  val thy = the_context ();
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    48
  val const_STR = Sign.intern_const thy "STR";
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    49
in
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    50
  val typ_ml_string = Type (Sign.intern_type thy "ml_string", []);
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    51
  fun term_ml_string s = Const (const_STR, HOList.typ_string --> typ_ml_string)
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    52
    $ HOList.term_string s
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    53
end;
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    54
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    55
end;
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    56
*}
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    57
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    58
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    59
subsection {* Code serialization *}
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    60
20453
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20439
diff changeset
    61
code_type ml_string
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20439
diff changeset
    62
  (SML target_atom "string")
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20439
diff changeset
    63
  (Haskell target_atom "String")
20400
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    64
20453
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20439
diff changeset
    65
code_const STR
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20439
diff changeset
    66
  (Haskell "_")
20400
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    67
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    68
setup {*
20699
0cc77abb185a refinements in codegen serializer
haftmann
parents: 20453
diff changeset
    69
  CodegenSerializer.add_pretty_ml_string "SML" "List.list.Nil" "List.list.Cons" "MLString.ml_string.STR"
20453
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20439
diff changeset
    70
    HOList.print_char HOList.print_string "String.implode"
20400
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    71
*}
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    72
20453
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20439
diff changeset
    73
code_const explode
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20439
diff changeset
    74
  (SML target_atom "String.explode")
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20439
diff changeset
    75
  (Haskell "_")
20400
0ad2f3bbd4f0 added some codegen examples/applications
haftmann
parents:
diff changeset
    76
20453
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20439
diff changeset
    77
end