mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-05 20:50:43 +00:00
bc73af37f2
collector a bit.
100 lines
2.4 KiB
R
100 lines
2.4 KiB
R
#include "Void.h"
|
|
#include "Nil.h"
|
|
#include "Number.h"
|
|
#include "builtins.h"
|
|
#include "defs.h"
|
|
#include "string.h"
|
|
#include "Cons.h"
|
|
#include "Continuation.h"
|
|
#include "BaseContinuation.h"
|
|
#include "Boolean.h"
|
|
|
|
SchemeObject bi_display (SchemeObject args, Machine m)
|
|
{
|
|
print([[args car] printForm]);
|
|
return [Void voidConstant];
|
|
}
|
|
|
|
SchemeObject bi_newline (SchemeObject args, Machine m)
|
|
{
|
|
print("\n");
|
|
return [Void voidConstant];
|
|
}
|
|
|
|
SchemeObject bi_add (SchemeObject args, Machine m)
|
|
{
|
|
local integer sum = 0;
|
|
local SchemeObject cur;
|
|
|
|
for (cur = args; cur != [Nil nil]; cur = [cur cdr]) {
|
|
sum += [(Number) [cur car] intValue];
|
|
}
|
|
|
|
return [Number newFromInt: sum];
|
|
}
|
|
|
|
SchemeObject bi_cons (SchemeObject args, Machine m)
|
|
{
|
|
[args cdr: [[args cdr] car]];
|
|
return args;
|
|
}
|
|
|
|
SchemeObject bi_null (SchemeObject args, Machine m)
|
|
{
|
|
return [args car] == [Nil nil]
|
|
?
|
|
[Boolean trueConstant] :
|
|
[Boolean falseConstant];
|
|
}
|
|
|
|
SchemeObject bi_car (SchemeObject args, Machine m)
|
|
{
|
|
return [[args car] car];
|
|
}
|
|
|
|
SchemeObject bi_cdr (SchemeObject args, Machine m)
|
|
{
|
|
return [[args car] cdr];
|
|
}
|
|
|
|
SchemeObject bi_apply (SchemeObject args, Machine m)
|
|
{
|
|
[m stack: [[args cdr] car]];
|
|
[[args car] invokeOnMachine: m];
|
|
return NIL;
|
|
}
|
|
|
|
SchemeObject bi_callcc (SchemeObject args, Machine m)
|
|
{
|
|
if ([m continuation]) {
|
|
[m stack: cons([m continuation], [Nil nil])];
|
|
} else {
|
|
[m stack: cons([BaseContinuation baseContinuation],
|
|
[Nil nil])];
|
|
}
|
|
[[args car] invokeOnMachine: m];
|
|
return NIL;
|
|
}
|
|
|
|
|
|
void builtin_addtomachine (Machine m)
|
|
{
|
|
[m addGlobal: symbol("display")
|
|
value: [Primitive newFromFunc: bi_display]];
|
|
[m addGlobal: symbol("newline")
|
|
value: [Primitive newFromFunc: bi_newline]];
|
|
[m addGlobal: symbol("+")
|
|
value: [Primitive newFromFunc: bi_add]];
|
|
[m addGlobal: symbol("cons")
|
|
value: [Primitive newFromFunc: bi_cons]];
|
|
[m addGlobal: symbol("null?")
|
|
value: [Primitive newFromFunc: bi_null]];
|
|
[m addGlobal: symbol("car")
|
|
value: [Primitive newFromFunc: bi_car]];
|
|
[m addGlobal: symbol("cdr")
|
|
value: [Primitive newFromFunc: bi_cdr]];
|
|
[m addGlobal: symbol("apply")
|
|
value: [Primitive newFromFunc: bi_apply]];
|
|
[m addGlobal: symbol("call-with-current-continuation")
|
|
value: [Primitive newFromFunc: bi_callcc]];
|
|
}
|