changeset 39:a997e42b9051

Add foreach method to array and add fib sample that can work in C environment and array example
author Mike Pavone <pavone@retrodev.com>
date Tue, 10 Jul 2012 23:18:14 -0700
parents e7be612fd3ae
children 927fd7911a01
files cbackend.js samples/fibnof.tp samples/testarray.tp
diffstat 3 files changed, 50 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/cbackend.js	Tue Jul 10 23:09:44 2012 -0700
+++ b/cbackend.js	Tue Jul 10 23:18:14 2012 -0700
@@ -373,6 +373,18 @@
 			'return (object *)self;'
 		]
 	});
+	array.addMessage('foreach', {
+		vars: {index: 'obj_int32 *', i: 'int32_t', clos: 'closure *'},
+		lines: [
+			'clos = va_arg(args, closure *);',
+			'for (i = 0; i < self->size; i++) {',
+			'	index = (obj_int32 *)make_object(&obj_int32_meta, NULL, 0);',
+			'	index->num = i;',
+			'	ccall(clos, 2, index, self->data[i]);',
+			'}',
+			'return (object *)self;'
+		]
+	});
 	forwarddec = toplevelcode = '';
 	forwarddec += int32.toEarlyCDef() + array.toEarlyCDef();
 	toplevelcode += int32.toCDef() + array.toCDef();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/samples/fibnof.tp	Tue Jul 10 23:18:14 2012 -0700
@@ -0,0 +1,27 @@
+#{
+
+true <- #{
+  if:else <- :self trueblock :elseblock {
+    trueblock:
+  }
+}
+
+false <- #{
+  if:else <- :self trueblock :elseblock {
+    elseblock:
+  }
+}
+
+fib <- :n {
+  if: n < 2 {
+    1
+  } else: {
+    (fib: n-1) + (fib: n-2)
+  }
+}
+
+main <- {
+  fib: 30
+}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/samples/testarray.tp	Tue Jul 10 23:18:14 2012 -0700
@@ -0,0 +1,11 @@
+#{
+	main <- {
+		foo <- #[42 30 28]
+		sum <- 0
+		foreach: foo :idx el {
+			sum <- sum + el
+		}
+		sum
+	}
+}
+