]> gitweb.ps.run Git - toc/commitdiff
changed example
authorPatrick Schönberger <patrick.schoenberger@posteo.de>
Thu, 12 Aug 2021 06:52:59 +0000 (08:52 +0200)
committerPatrick Schönberger <patrick.schoenberger@posteo.de>
Thu, 12 Aug 2021 06:52:59 +0000 (08:52 +0200)
src/main.cpp
test/test.toc [moved from test/test2.toc with 51% similarity]
test/test1.toc [deleted file]

index 6792e832b692413aa6a6c916690d0707a19d9222..5b53b1004c3641114bf820cad06fabdd4a749c10 100644 (file)
@@ -15,7 +15,7 @@ using namespace antlr4;
 \r
 int main(int argc, const char * argv[])\r
 {\r
-  std::ifstream ifs("test/test2.toc");\r
+  std::ifstream ifs("test/test.toc");\r
 \r
   ANTLRInputStream input(ifs);\r
 \r
similarity index 51%
rename from test/test2.toc
rename to test/test.toc
index c65596a34ce812b8032e4ebcb3ec99cfbb6c8aee..b3ff1eabaddfa16a77e8ec8e78fffcf5a220c7e6 100644 (file)
@@ -1,5 +1,39 @@
+// simply declare external functions\r
 func puts(str : char*) : void;\r
 \r
+// global context can contain functions,\r
+// structs, global variables and namespaces\r
+var global1 : int;\r
+var global2 : double = 123.45;\r
+\r
+func globalFunc() : void {\r
+  //puts("Hello\n");\r
+}\r
+\r
+// structs and functions can be declared generic\r
+// by providing a list of placeholder typenames\r
+struct S1<T1, T2> {\r
+  t1: T1;\r
+  t2: T1;\r
+\r
+  m1() : T2 {\r
+    return this->t1 + this->t2;\r
+  }\r
+}\r
+\r
+struct S2 {\r
+  s: char *;\r
+  abc(): S2 { }\r
+  xyz(): S2 { }\r
+}\r
+\r
+func generic1<A>(a1 : A, a2 : A) : A {\r
+  return a1 + a2;\r
+}\r
+\r
+// namespaces can contain everything that\r
+// the global context can\r
+\r
 namespace N1 {\r
   var v1 : int;\r
   func f1() : void {\r
@@ -8,19 +42,21 @@ namespace N1 {
   struct S1 {\r
     test : char *;\r
   }\r
-  // hallo\r
+  // nested namespaces\r
   namespace N2 {\r
-    var v1 : int; //buige\r
+    var v1 : int;\r
     struct S1 {\r
       i1 : int;\r
       i2 : int;\r
       i3 : int;\r
 \r
       m1(i: int) : int {\r
+        // implicit 'this' parameter, pointer to containing struct\r
         this->i3 = this->i1 * this->i2;\r
 \r
-        f1(v1);\r
-        N1::f1(N1::v1);\r
+        // lookup is done hierarchically\r
+        f1(v1); // this is basically N1::N2::f1(N1::N2::v1);\r
+        N1::f1(N1::v1); // the rest becomes exactly what they say\r
         N2::f1(N2::v1);\r
         N1::N2::f1();\r
 \r
@@ -29,6 +65,7 @@ namespace N1 {
     }\r
 \r
     func f1() : void {\r
+      // these have the same type\r
       var s1 : N1::N2::S1;\r
       var s2 : S1;\r
 \r
@@ -37,25 +74,6 @@ namespace N1 {
   }\r
 }\r
 \r
-struct S1<T> {\r
-  t1: T;\r
-  t2: T;\r
-\r
-  m1() : T {\r
-    return this->t1 + this->t2;\r
-  }\r
-}\r
-\r
-struct S2 {\r
-  s: char *;\r
-  abc(): S2 { }\r
-  xyz(): S2 { }\r
-}\r
-\r
-func generic1<A>(a1 : A, a2 : A) : A {\r
-  return a1 + a2;\r
-}\r
-\r
 func main(argc : int, argv : char**) : int {\r
   var s1 : N1::N2::S1;\r
   var s2 : N1::N2::S1;\r
@@ -66,7 +84,8 @@ func main(argc : int, argv : char**) : int {
 \r
   N1::N2::f1();\r
 \r
-  var s4 : S1<int>;\r
+  // one 'copy' is compiled for every unique instantiation\r
+  var s4 : S1<int, long>;\r
   s4.t1 = 123;  \r
   s4.t2 = 456;  \r
   s4.m1();\r
diff --git a/test/test1.toc b/test/test1.toc
deleted file mode 100644 (file)
index 1f604c0..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-var abc: int;\r
-var def: int;\r
-var ghi: int;\r
-\r
-func f1<A, B> (a : int, b : int, cs: int[]) : int {\r
-  var i1 : int;\r
-  var s1 : S1;\r
-  if a != i1 {\r
-    var i2 : int = 987;\r
-    return i2;\r
-  }\r
-  print(s1.i1);\r
-  print(s1.a1[0]);\r
-  return 133;\r
-}\r
-\r
-struct S1<T> {\r
-  i1 : int;\r
-  i2 : int;\r
-  a1 : int[10];\r
-  a2 : int[10]*;\r
-  a2 : int[];\r
-\r
-  m1<I>() : void {\r
-    while i1 < i2 {\r
-      i1 = m2(i1);\r
-\r
-      i2 = i1 + i2 * (i2 - 45) + 4;\r
-\r
-      print(12345);\r
-    }\r
-  }\r
-\r
-  m2<A>(i: int) : int {\r
-    var j : int = 0;\r
-    while j < 10 {\r
-      print(a1[j]);\r
-    }\r
-  }\r
-}
\ No newline at end of file