From: NeilBrown <neil@brown.name>
Date: Sat, 18 Dec 2021 03:34:16 +0000 (+1100)
Subject: oceani: use new slice syntax for argv argument.
X-Git-Url: https://ocean-lang.org/code/?a=commitdiff_plain;h=2d3b3f67a78d853da192c5568a29710fb8898a6c;p=ocean

oceani: use new slice syntax for argv argument.

Rather than "argv:[argc::]string", the argv parameter is now
  "argv:[]string"
This will be the syntax for general array references.

Signed-off-by: NeilBrown <neil@brown.name>
---

diff --git a/csrc/oceani-tests.mdc b/csrc/oceani-tests.mdc
index 03aa850..9db8e93 100644
--- a/csrc/oceani-tests.mdc
+++ b/csrc/oceani-tests.mdc
@@ -113,7 +113,7 @@ calculations on them.
 
 ###### test: valvar
 
-	func main(argv:[argc::]string)
+	func main(argv:[]string)
 		a := 23; b:=12 ; b1 := -b
 		print a, b, a+b, a-b, a*b, a/b, a%b
 		print a<b, a<=b, a>b, a>=b, a<a, a==b, a==a
@@ -319,7 +319,7 @@ Here I break it into two parts, keeping the array code separate.
 
 ###### test: sayhello
 
-	func main(av:[ac::number]string)
+	func main(av:[]string)
 		A := $av[1]; B := $av[2]
 		astr := av[3]
 		l := av[]
@@ -750,7 +750,7 @@ A simple linked list example
 			freelist(lp)
 			@free = list.next
 
-	func main(argv:[ac::]string)
+	func main(argv:[]string)
 		list : linkage
 
 		insert(list, "@start");
diff --git a/csrc/oceani.mdc b/csrc/oceani.mdc
index fb154be..a3574ea 100644
--- a/csrc/oceani.mdc
+++ b/csrc/oceani.mdc
@@ -2468,15 +2468,11 @@ with a const size by whether they are prepared at parse time or not.
 		/* Both are arrays, so we can look at details */
 		if (!type_compat(require->array.member, have->array.member, 0))
 			return 0;
-		if (have->array.unspec && require->array.unspec) {
-			if (have->array.vsize && require->array.vsize &&
-			    have->array.vsize != require->array.vsize)	// UNTESTED
-				/* sizes might not be the same */
-				return 0;	// UNTESTED
-			return 1;
-		}
+		if (have->array.unspec && require->array.unspec &&
+		    have->array.size != require->array.size)
+			return 0;	// UNTESTED
 		if (have->array.unspec || require->array.unspec)
-			return 1;	// UNTESTED
+			return 1;
 		if (require->array.vsize == NULL && have->array.vsize == NULL)
 			return require->array.size == have->array.size;
 
@@ -2554,25 +2550,14 @@ with a const size by whether they are prepared at parse time or not.
 		$0->array.vsize = v;
 	} }$
 
-###### Grammar
-	$*type
-	OptType -> Type ${ $0 = $<1; }$
-		| ${ $0 = NULL; }$
-
 ###### formal type grammar
 
-	| [ IDENTIFIER :: OptType ] Type ${ {
-		struct variable *v = var_decl(c, $ID.txt);
-
-		v->type = $<OT;
-		v->constant = 1;
-		if (!v->type)
-			v->type = Tnum;
-		$0 = add_anon_type(c, &array_prototype, "array[var]");
-		$0->array.member = $<6;
+	| [ ] Type ${ {
+		$0 = add_anon_type(c, &array_prototype, "array[]");
+		$0->array.member = $<Type;
 		$0->array.size = 0;
 		$0->array.unspec = 1;
-		$0->array.vsize = v;
+		$0->array.vsize = NULL;
 	} }$
 
 ###### Binode types
@@ -5950,15 +5935,12 @@ is a bit more interesting at this level.
 			struct value *vl = var_value(c, v->var);
 			struct value arg;
 			struct type *t;
-			mpq_t argcq;
 			int i;
 
 			switch (anum++) {
 			case 0: /* argv */
 				t = v->var->type;
-				mpq_init(argcq);
-				mpq_set_ui(argcq, argc, 1);
-				memcpy(var_value(c, t->array.vsize), &argcq, sizeof(argcq));
+				t->array.size = argc;
 				t->prepare_type(c, t, 0);
 				array_init(v->var->type, vl);
 				for (i = 0; i < argc; i++) {
@@ -6012,7 +5994,7 @@ things which will likely grow as the languages grows.
 		name:string
 		alive:Boolean
 
-	func main(argv:[argc::]string)
+	func main(argv:[]string)
 		print "Hello World, what lovely oceans you have!"
 		print "Are there", five, "?"
 		print pi, pie, "but", cake