File: Test086.ML

package info (click to toggle)
polyml 5.7.1-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 40,524 kB
  • sloc: cpp: 44,142; ansic: 26,963; sh: 22,002; asm: 13,486; makefile: 602; exp: 525; python: 253; awk: 91
file content (29 lines) | stat: -rw-r--r-- 811 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
(* Tests on coercions that apply between structures and signatures. *)

functor F():
    sig
        val a: exn and b: string->exn
        val checkA: (unit -> unit) -> unit
        val checkB: (unit -> unit) -> string
        type t
        val c: t and d: int->t
        val checkC: t -> unit and checkD: t -> unit
    end
=
    struct
        exception a and b of string
        datatype t = c | d of int
        
        fun checkA f = f() handle a => ()
        fun checkB f = (f(); "bad") handle b s => s
        fun checkC c = () | checkC _ = raise Fail "bad"
        fun checkD (d 1) = () | checkD _  = raise Fail "bad"
        
    end;

structure S = F();

S.checkA(fn () => raise S.a);
if S.checkB(fn () => raise S.b "test") = "test" then () else raise Fail "failed";
S.checkC S.c;
S.checkD (S.d 1);