summaryrefslogtreecommitdiff
path: root/tiger-compiler/tests/good/merge.tig
blob: 9504ccfb94ffa16de33cde40e26fcef4fdb656c7 (plain)
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
let
 type any = {any : int}
 var buffer := getchar()

 function readint(any : any) : int =
   let var i := 0
       function isdigit(s : string) : int =
         ord("0") <= ord(s) & ord(s) <= ord("9")
       function skipto() =
         while buffer = " " | buffer = "\n"
           do buffer := getchar()
   in skipto();
      any.any := isdigit(buffer);
      while isdigit(buffer)
        do (i := i * 10 + ord(buffer) - ord("0");
            buffer := getchar());
      i
   end

 type list = {first : int, rest : list}

 function readlist() : list =
   let var any := any{any=0}
       var i := readint(any)
   in if any.any
        then list{first=i,rest=readlist()}
        else nil
   end

 function merge(a : list, b : list) : list =
   if a = nil then b
   else if b = nil then a
   else if a.first < b.first
      then list {first = a.first, rest = merge(a.rest, b)}
      else list {first = b.first, rest = merge(a, b.rest)}

 function printint(i : int) =
   let function f(i : int) =
        if i > 0
        then (f(i/10); print (chr(i-i/10*10+ord("0"))))
   in if i < 0 then (print("-"); f(-i))
      else if i>0 then f(i)
      else print("0")
   end

 function printlist(l : list) =
   if l = nil then print("\n")
   else (printint(l.first); print(" "); printlist(l.rest))

   var list1 := readlist()
   var list2 := (buffer := getchar(); readlist())

in printlist(merge(list1,list2))
end