aboutsummaryrefslogtreecommitdiff
path: root/compiler.d
diff options
context:
space:
mode:
Diffstat (limited to 'compiler.d')
-rw-r--r--compiler.d17
1 files changed, 17 insertions, 0 deletions
diff --git a/compiler.d b/compiler.d
index f721e86..2480918 100644
--- a/compiler.d
+++ b/compiler.d
@@ -582,6 +582,19 @@ class Compiler {
}
// LISP-Y
+ void compileApply(Form[] args) {
+ if (args.length != 2) {
+ this.error(format("'apply?': expected [2] argument, received %d", to!int(args.length)), -1);
+ return;
+ }
+ ValueType vt1 = this.resolve(args[0], ValueType.ANY); // this should be a function
+ vt1 = this.resolve(args[1], ValueType.ANY);
+
+ // ungroup the list and call the function
+ this.func.chunk.writeOp(OpCode.OP_UNGROUP, args[1].line);
+ this.func.chunk.writeOp(OpCode.OP_CALL_N, args[1].line);
+ }
+
void compileBlock(Form form) {
Block block = cast(Block)form;
this.beginScope();
@@ -1088,6 +1101,9 @@ class Compiler {
break;
// OTHER
+ case "apply":
+ this.compileApply(cons.tail);
+ break;
case "print":
this.compilePrint(cons.tail);
break;
@@ -1223,6 +1239,7 @@ class Compiler {
this.globals["reverse"] = 1;
// OTHER
+ this.globals["apply"] = 2;
this.globals["print"] = 1;
}