shithub: mc

Download patch

ref: 72958419b4fb70531051e05e2ca56ecccc524b6b
parent: e7ebda38777e5251b3479c3fdced4cb108f252e4
author: Ori Bernstein <[email protected]>
date: Sun Jan 14 08:57:54 EST 2018

Update language spec for new trait syntax.

--- a/doc/lang.txt
+++ b/doc/lang.txt
@@ -190,7 +190,8 @@
 
     3.3. Declarations:
 
-            decl:       attrs ("var" | "const" | "generic")  decllist
+            decl:       attrs declkind  decllist [traitspec]
+	    declkind:   ("var" | "const" | "generic") 
             attrs:      ("extern" | "pkglocal" | "$noret")*
             decllist:   declbody ("," declbody)*
             declbody:   declcore ["=" expr]
@@ -530,9 +531,7 @@
 
     4.3. Generic types:
 
-            typaram:        "@" ident ["::" paramlist]
-            paramlist:      ident | "(" ident ("," ident)* ")"
-            
+            typaram:        "@" ident
 
         A nametype refers to a (potentially parameterized) named type, as
         defined in section 4.5.
@@ -591,7 +590,7 @@
 
         4.4.2. Impls:
 
-                implstmt:        "impl" ident impltypes "=" implbody
+                implstmt:        "impl" ident impltypes traitspec "=" implbody
                 impltypes:       type ["->" type ("," type)*]
                 implbody:        (name [":" type] "=" expr)*
 
@@ -637,8 +636,8 @@
                 specific type that represents them.
                 - Types are freshened. Freshening is the process of replacing
                 unbound type parameters with type variables, such that
-                '@a::(integral,numeric)' is replaced with the type variable
-                '$n::(integral,numeric)'.
+                '@a :: integral @a, numeric @a' is replaced with the type variable
+                '$n :: integral $n, numeric $n'.
                 - Union tags are registered for delayed unification, with the type
                 for unions being the declaration type of the variable.
 
@@ -782,8 +781,8 @@
             a single pass suffices.
 
             At this point, default types are applied. An unconstrained type
-            with type $t::(numeric,integral) is replaced with int. An
-            unconstrained type with $t::(numeric,floating) is replaced with
+            with type $t :: numeric $t, integral $t is replaced with int. An
+            unconstrained type with $t :: numeric $t, floating $t is replaced with
             flt64.
 
     4.6. Built In Traits:
@@ -950,7 +949,7 @@
 
                     e.g. 0x123_fff, 0b1111, 0o777, 1234
 
-                They have the type `@a::(numeric,integral)
+                They have the type `@a :: numeric @a, integral @a
 
             5.1.1.4: Boolean Literals:
 
@@ -980,7 +979,7 @@
 
                     e.g. 123.456, 10.0e7, 1_000.
 
-                They have type `@a::(numeric,floating)`
+                They have type `@a :: numeric @a, floating @a`
 
 
         5.1.2. Sequence and Tuple Literals:
@@ -1043,7 +1042,8 @@
 
         5.1.3. Function Literals:
 
-                funclit:        "{" arglist ["->" rettype] "\n" blockbody "}"
+                funclit:        "{" arglist ["->" rettype] [traitspec] "\n"
+		                blockbody "}"
                 arglist:        (ident [":" type])*
 
             Function literals describe a function. They begin with a '{',
@@ -1461,8 +1461,7 @@
 
             Type:
 
-                ( e1 : @a OP e2 : @a ) : bool
-                where @a :: numeric
+                ( e1 : @a OP e2 : @a ) : bool :: numeric @a
 
 
         5.2.11. Union Constructors:
@@ -1488,8 +1487,7 @@
 
             Type:
 
-                (e1 : @a OP e2:@a) : @a
-                where @a :: integral
+                (e1 : @a OP e2:@a) : @a :: integral @a
 
         5.2.13. Addition:
         
@@ -1503,8 +1501,7 @@
 
             Type:
 
-                ( e1 : @a OP e2 : @a ) : bool
-                where @a :: numeric
+                ( e1 : @a OP e2 : @a ) : bool :: numeric @a
 
         
         5.2.14. Multiplication and Division
@@ -1516,8 +1513,7 @@
 
             Type:
 
-                ( e1 : @a OP e2 : @a ) : bool
-                where @a :: numeric
+                ( e1 : @a OP e2 : @a ) : bool :: numeric @a
 
         5.2.15. Modulo:
         
@@ -1528,8 +1524,7 @@
 
             Type:
 
-                ( e1 : @a OP e2 : @a ) : bool
-                where @a :: (numeric,integral)
+                ( e1 : @a OP e2 : @a ) : bool :: numeric @a, integral @a
 
         5.2.16. Shift:
 
@@ -1545,8 +1540,7 @@
 
             Type:
 
-                (e1 : @a OP e2:@a) : @a
-                where @a :: integral
+                (e1 : @a OP e2:@a) : @a :: integral @a
 
         5.2.17: Postincrement, Postdecrement:
 
@@ -1570,7 +1564,7 @@
 
                 (e1++ : @a) : @a
                 (e1-- : @a) : @a
-                where @a :: integral
+                :: integral @a
 
         5.2.18: Address:
 
@@ -1636,7 +1630,7 @@
 
                 (expr : <aggregate>).name : @a
                 (expr : <seq>).len : @idx
-                where @idx :: (integral,numeric)
+                :: integral @a, numeric @a
 
         5.2.22: Index:
 
@@ -1653,7 +1647,7 @@
 
                 (expr : @a[N])[(idx : @idx)] : @a
                 (expr : @a[:])[(idx : @idx)] : @a
-                where @idx :: (integral,numeric)
+                :: integral, numeric @idx
 
         5.2.23: Slice:
 
@@ -1675,8 +1669,7 @@
                 (expr : @a[N])[(lo : @lo) : (hi : @hi)] : @a[:]
                 (expr : @a[:])[(lo : @lo) : (hi : @hi)] : @a[:]
                 (expr : @#)[(lo : @lo) : (hi : @hi)] : @a[:]
-                where @lo :: (integral,numeric)
-                and   @hi :: (integral,numeric)
+                :: integral, numeric @lo, integral, numeric @hi
 
         5.2.24: Call:
 
@@ -1960,7 +1953,7 @@
     pkgbody:   (decl | attrs tydef | traitdef | impldef)*
 
     /* declarations */
-    decl:       attrs ("var" | "const" | "generic") decllist
+    decl:       attrs ("var" | "const" | "generic") decllist 
     attrs:      ("$noret" | "extern" | "pkglocal")*
     decllist:   declbody ("," declbody)+
     declbody:   declcore ["=" expr]
@@ -1967,14 +1960,16 @@
     declcore:   ident [":" type]
 
     /* traits */
-    traitdef:   "trait" ident typaram [auxtypes] ("\n" | "=" traitbody ";;")
+    traitdef:   "trait" ident typaram [auxtypes] [traitspec] ("\n" | "=" traitbody ";;")
     auxtypes:   "->" type ("," type)*
     traitbody:  "\n"* (ident ":" type "\n"*)*
-    impldef:    "impl" ident type [auxtypes] ("\n" | "=" implbody ";;")
+    impldef:    "impl" ident type [auxtypes] [traitspec] ("\n" | "=" implbody ";;")
     implbody:   "\n"* (ident [":" type] "=" expr "\n"*)*
 
     /* types */
-    tydef:      "type" typeid "=" type
+    traitspec:  "::" traitvar+
+    traitvar:   name+ type ["->" type]
+    tydef:      "type" typeid [traitspec] "=" type
     typeid:     ident | ident "(" typarams ")"
     typarams:   typaram ("," typaram)*
     type:       structdef | uniondef | tupledef |
@@ -1984,8 +1979,7 @@
     uniondef:   "union" unionbody ";;"
     unionbody:	("`" ident [type])*
     tupledef:   "(" type ("," type)* ")"
-    generic:    typaram ["::" traitlist]
-    traitlist:  name | "(" name ("," name)
+    generic:    typaram
     constructed: functype | sicetype | arraytype | ptrtype | void | name
     functype:   "(" arglist "->" type ")"
     arglist:    [arg ("," arg)*]
@@ -2024,7 +2018,7 @@
 
     /* literals */
     literal:    funclit | seqlit | tuplit | simplelit
-    funclit:    "{" [funcargs] ";" blockbody "}"
+    funclit:    "{" [funcargs] [traitspec] "\n" blockbody "}"
     funcargs:   ident [ ":" type] ("," ident [ ":" type])*
     seqlit:     "[" structelts | [arrayelts] "]"
     arrayelts:  arrayelt ("," arrayelt)*
--- a/parse/gram.y
+++ b/parse/gram.y
@@ -1114,7 +1114,8 @@
 
 %%
 
-static void setupinit(Node *n)
+static void
+setupinit(Node *n)
 {
 	char name[1024];
 	char *p, *s;
@@ -1136,7 +1137,8 @@
 	n->decl.name->name.name = strdup(s);
 }
 
-static Node *mkpseudodecl(Srcloc l, Type *t)
+static Node *
+mkpseudodecl(Srcloc l, Type *t)
 {
 	static int nextpseudoid;
 	char buf[128];
@@ -1145,7 +1147,8 @@
 	return mkdecl(l, mkname(l, buf), t);
 }
 
-static void setattrs(Node *dcl, char **attrs, size_t nattrs)
+static void
+setattrs(Node *dcl, char **attrs, size_t nattrs)
 {
 	size_t i;
 
@@ -1159,7 +1162,8 @@
 	}
 }
 
-static void setwith(Type *ty, Traitspec **ts, size_t nts)
+static void
+setwith(Type *ty, Traitspec **ts, size_t nts)
 {
 	size_t i, j;
 
@@ -1201,7 +1205,8 @@
 	}
 }
 
-static void installucons(Stab *st, Type *t)
+static void
+installucons(Stab *st, Type *t)
 {
 	Type *b;
 	size_t i;
@@ -1227,7 +1232,8 @@
 }
 
 
-static Op binop(int tt)
+static Op
+binop(int tt)
 {
 	Op o;