abouttreesummaryrefslogcommitdiff
path: root/test/test.toc
blob: b3ff1eabaddfa16a77e8ec8e78fffcf5a220c7e6 (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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
// simply declare external functions
func puts(str : char*) : void;

// global context can contain functions,
// structs, global variables and namespaces
var global1 : int;
var global2 : double = 123.45;

func globalFunc() : void {
  //puts("Hello\n");
}

// structs and functions can be declared generic
// by providing a list of placeholder typenames
struct S1<T1, T2> {
  t1: T1;
  t2: T1;

  m1() : T2 {
    return this->t1 + this->t2;
  }
}

struct S2 {
  s: char *;
  abc(): S2 { }
  xyz(): S2 { }
}

func generic1<A>(a1 : A, a2 : A) : A {
  return a1 + a2;
}

// namespaces can contain everything that
// the global context can

namespace N1 {
  var v1 : int;
  func f1() : void {
    puts("Hello\n");
  }
  struct S1 {
    test : char *;
  }
  // nested namespaces
  namespace N2 {
    var v1 : int;
    struct S1 {
      i1 : int;
      i2 : int;
      i3 : int;

      m1(i: int) : int {
        // implicit 'this' parameter, pointer to containing struct
        this->i3 = this->i1 * this->i2;

        // lookup is done hierarchically
        f1(v1); // this is basically N1::N2::f1(N1::N2::v1);
        N1::f1(N1::v1); // the rest becomes exactly what they say
        N2::f1(N2::v1);
        N1::N2::f1();

        return this->i1 + this->i2;
      }
    }

    func f1() : void {
      // these have the same type
      var s1 : N1::N2::S1;
      var s2 : S1;

      s1.m1(123);
    }
  }
}

func main(argc : int, argv : char**) : int {
  var s1 : N1::N2::S1;
  var s2 : N1::N2::S1;
  var s3 : N1::S1;
  s1.i1 = 123;
  s1.i2 = 456;
  s1.m1(s2.m1(s3.m1(89)));

  N1::N2::f1();

  // one 'copy' is compiled for every unique instantiation
  var s4 : S1<int, long>;
  s4.t1 = 123;  
  s4.t2 = 456;  
  s4.m1();

  generic1<int>(1, 2);
  generic1<double>(3.4, 5.6);

  var s: S2;
  s.abc().xyz();

  return 0;
}