]> gitweb.ps.run Git - toc/blob - test/test.toc
fixed NAME grammar rule
[toc] / test / test.toc
1 // simply declare external functions\r
2 func puts(str : char*) : void;\r
3 \r
4 // global context can contain functions,\r
5 // structs, global variables and namespaces\r
6 var global1 : int;\r
7 var global2 : double = 123.45;\r
8 \r
9 func globalFunc() : void {\r
10   //puts("Hello\n");\r
11 }\r
12 \r
13 // structs and functions can be declared generic\r
14 // by providing a list of placeholder typenames\r
15 struct S1<T1, T2> {\r
16   t1: T1;\r
17   t2: T1;\r
18 \r
19   m1() : T2 {\r
20     return this->t1 + this->t2;\r
21   }\r
22 }\r
23 \r
24 func generic1<A>(a1 : A, a2 : A) : A {\r
25   return a1 + a2;\r
26 }\r
27 \r
28 // namespaces can contain everything that\r
29 // the global context can\r
30 \r
31 namespace N1 {\r
32   var v1 : int;\r
33   func f1() : void {\r
34     puts("Hello\n");\r
35   }\r
36   struct S1 {\r
37     test : char *;\r
38   }\r
39   // nested namespaces\r
40   namespace N2 {\r
41     var v1 : int;\r
42     struct S1 {\r
43       i1 : int;\r
44       i2 : int;\r
45       i3 : int;\r
46 \r
47       m1(i: int) : int {\r
48         // implicit 'this' parameter, pointer to containing struct\r
49         this->i3 = this->i1 * this->i2;\r
50 \r
51         // lookup is done hierarchically\r
52         f1(v1); // this is basically N1::N2::f1(N1::N2::v1);\r
53         N1::f1(N1::v1); // the rest becomes exactly what they say\r
54         N2::f1(N2::v1);\r
55         N1::N2::f1();\r
56 \r
57         return this->i1 + this->i2;\r
58       }\r
59     }\r
60 \r
61     struct S2 {\r
62       s: char *;\r
63       abc(): S1 {\r
64         var result : S1;\r
65         return result;\r
66       }\r
67     }\r
68 \r
69     func f1() : void {\r
70       // these have the same type\r
71       var s1 : N1::N2::S1;\r
72       var s2 : S1;\r
73 \r
74       s1.m1(123);\r
75     }\r
76   }\r
77 }\r
78 \r
79 func main(argc : int, argv : char**) : int {\r
80   var s1 : N1::N2::S1;\r
81   var s2 : N1::N2::S1;\r
82   var s3 : N1::S1;\r
83   s1.i1 = 123;\r
84   s1.i2 = 456;\r
85   s1.m1(s2.m1(s3.m1(89)));\r
86 \r
87   N1::N2::f1();\r
88 \r
89   // one 'copy' is compiled for every unique instantiation\r
90   var s4 : S1<int, long>;\r
91   s4.t1 = 123;  \r
92   s4.t2 = 456;  \r
93   s4.m1();\r
94 \r
95   generic1<int>(1, 2);\r
96   generic1<double>(3.4, 5.6);\r
97 \r
98   var s: N1::N2::S2;\r
99   s.abc();\r
100 \r
101   return 0;\r
102 }