quakeforge/ruamoko/scheme/main.r
2020-03-03 17:35:14 +09:00

78 lines
2.2 KiB
R

#include "Parser.h"
#include "Nil.h"
#include "Cons.h"
#include "Lambda.h"
#include "defs.h"
#include "qfile.h"
#include "string.h"
#include "builtins.h"
#include "Compiler.h"
#include "Machine.h"
#include "CompiledCode.h"
string readfile (string filename)
{
local string acc = "", res;
local QFile file = Qopen (filename, "r");
while (!Qeof (file)) {
acc += Qgetline (file);
}
Qclose (file);
res = str_new();
str_copy(res, acc);
return res;
}
int main (int argc, string *argv)
{
local Parser *parser;
local CompiledCode *code;
local Compiler *comp;
local Machine *vm;
local Lambda *lm;
local SchemeObject *stuff, *res;
local Error *err;
if (argc < 1) {
return -1;
}
//traceon();
parser = [Parser newFromSource: readfile(argv[1]) file: argv[1]];
vm = [Machine new];
[vm makeRootCell];
[parser makeRootCell];
builtin_addtomachine (vm);
while ((stuff = [parser read])) {
if ([stuff isError]) {
err = (Error *) stuff;
printf(">> %s: %i\n", [err source], [err line]);
printf(">> Error (%s): %s\n", [err type], [err message]);
return -1;
}
comp = [Compiler newWithLambda: cons ([Symbol forString: "lambda"],
cons ([Nil nil],
cons(stuff, [Nil nil])))
scope: nil];
code = (CompiledCode *) [comp compile];
if ([code isError]) {
err = (Error *) code;
printf(">> %s: %i\n", [err source], [err line]);
printf(">> Error (%s): %s\n", [err type], [err message]);
return -1;
}
lm = [Lambda newWithCode: code environment: nil];
[lm invokeOnMachine: vm];
res = [vm run];
if ([res isError]) {
err = (Error *) res;
printf(">> %s: %i\n", [err source], [err line]);
printf(">> Error (%s): %s\n", [err type], [err message]);
return -1;
}
[vm reset];
}
[SchemeObject finishCollecting];
return 0;
}