mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-06 13:11:20 +00:00
281b683e14
standard, implemented in Ruamoko. Currently works for a few simple "Hello, world!" programs.
82 lines
1.4 KiB
R
82 lines
1.4 KiB
R
#include "string.h"
|
|
#include "Cons.h"
|
|
#include "Nil.h"
|
|
#include "defs.h"
|
|
|
|
Cons cons (SchemeObject car, SchemeObject cdr)
|
|
{
|
|
return [Cons newWithCar: car cdr: cdr];
|
|
}
|
|
|
|
@implementation Cons
|
|
|
|
+ (id) newWithCar: (SchemeObject) a cdr: (SchemeObject) d
|
|
{
|
|
return [[self alloc] initWithCar: a cdr: d];
|
|
}
|
|
|
|
- (id) initWithCar: (SchemeObject) a cdr: (SchemeObject) d
|
|
{
|
|
car = a;
|
|
cdr = d;
|
|
|
|
if (!car) {
|
|
print("Cons: WARNING: NIL car\n");
|
|
} else if (!cdr) {
|
|
print("cons: WARNING: NIL cdr\n");
|
|
}
|
|
|
|
return [super init];
|
|
}
|
|
|
|
- (SchemeObject) car
|
|
{
|
|
return car;
|
|
}
|
|
|
|
- (void) car: (SchemeObject) a
|
|
{
|
|
car = a;
|
|
}
|
|
|
|
- (SchemeObject) cdr
|
|
{
|
|
return cdr;
|
|
}
|
|
|
|
- (void) cdr: (SchemeObject) d
|
|
{
|
|
cdr = d;
|
|
}
|
|
|
|
- (void) mark
|
|
{
|
|
[super mark];
|
|
[car mark];
|
|
[cdr mark];
|
|
}
|
|
|
|
- (string) printForm
|
|
{
|
|
local string acc = "", res;
|
|
local id cur, next = NIL;
|
|
|
|
for (cur = self; cur; cur = next) {
|
|
next = [cur cdr];
|
|
acc = acc + [[cur car] printForm];
|
|
if (next == [Nil nil]) {
|
|
next = NIL;
|
|
} else if (next && ![next isKindOfClass: [Cons class]]) {
|
|
acc = acc + " . " + [next printForm];
|
|
next = NIL;
|
|
} else if (next) {
|
|
acc = acc + " ";
|
|
}
|
|
}
|
|
|
|
res = str_new();
|
|
str_copy(res, sprintf("(%s)", acc));
|
|
return res;
|
|
}
|
|
|
|
@end
|