4 * BRICS Technical Report RS
98-12
5 * Olivier Danvy
, May
1998
13 val format
: (string, 'a
) t
-> 'a
14 val int: ('a
, int -> 'a
) t
15 val list
: ('a
, 'b
-> 'a
) t
-> ('a
, 'b list
-> 'a
) t
16 val lit
: string -> ('a
, 'a
) t
17 val new
: ('b
-> string) -> ('a
, 'b
-> 'a
) t
18 val o: ('a
, 'b
) t
* ('c
, 'a
) t
-> ('c
, 'b
) t
19 val string: ('a
, string -> 'a
) t
22 structure Format
:> FORMAT
=
25 type ('a
, 'b
) t
= (string list
-> 'a
) * string list
-> 'b
27 val new
: ('b
-> string) -> ('a
, 'b
-> 'a
) t
=
28 fn toString
=> fn (k
, ss
) => fn b
=> k (toString b
:: ss
)
30 val lit
: string -> ('a
, 'a
) t
= fn s
=> fn (k
, ss
) => k (s
:: ss
)
32 val eol
: ('a
, 'a
) t
= fn z
=> lit
"\n" z
34 val format
: (string, 'a
) t
-> 'a
= fn f
=> f (concat
o rev
, [])
36 val int: ('a
, int -> 'a
) t
= fn z
=> new
Int.toString z
38 val list
: ('a
, 'b
-> 'a
) t
-> ('a
, 'b list
-> 'a
) t
=
40 fn [] => k ("[]" :: ss
)
46 | x
:: xs
=> f (loop xs
, ", " :: ss
) x
47 in f (loop xs
, "[" :: ss
) x
50 val op o: ('a
, 'b
) t
* ('c
, 'a
) t
-> ('c
, 'b
) t
=
51 fn (f
, g
) => fn (k
, ss
) => f (fn ss
=> g (k
, ss
), ss
)
53 val string: ('a
, string -> 'a
) t
= fn z
=> new (fn s
=> s
) z
61 "abc" = format (lit
"abc")
62 andalso "abc" = format
string "abc"
63 andalso "abc" = format (lit
"a" o lit
"b" o lit
"c")
64 andalso "abc" = format (string o string o string) "a" "b" "c"
65 andalso "[a, b, c]" = format (list
string) ["a", "b", "c"]
66 andalso "[1, 2, 3]" = format (list
int) [1, 2, 3]