aboutsummaryrefslogtreecommitdiff
path: root/compiler.d
diff options
context:
space:
mode:
Diffstat (limited to 'compiler.d')
-rw-r--r--compiler.d15
1 files changed, 15 insertions, 0 deletions
diff --git a/compiler.d b/compiler.d
index 92711f1..66ee664 100644
--- a/compiler.d
+++ b/compiler.d
@@ -521,6 +521,18 @@ class Compiler {
this.func.chunk.writeOp(to!ubyte(length), args[0].line);
}
+ void compileLength(Form[] args) {
+ // TODO how do we identify/propagate errors?
+ if (args.length != 1) {
+ writeln("COMPILE ERROR: 'first' expects exactly one argument");
+ return;
+ }
+ ValueType vt = this.resolve(args[0], ValueType.SEQ); // TODO need a new type
+ this.func.chunk.writeOp(OpCode.OP_TYPE_CHECK_SEQ, args[0].line);
+
+ this.func.chunk.writeOp(OpCode.OP_LENGTH, args[0].line);
+ }
+
void compileFirst(Form[] args) {
// TODO how do we identify/propagate errors?
if (args.length != 1) {
@@ -676,6 +688,9 @@ class Compiler {
case "first":
this.compileFirst(cons.tail);
break;
+ case "length":
+ this.compileLength(cons.tail);
+ break;
case "list":
//return compileList(cons.tail);
this.compileList(cons.tail);