mirror of
https://github.com/samsonjs/sectorlisp.git
synced 2026-04-27 14:57:41 +00:00
Add fixups
This commit is contained in:
parent
43abc6e396
commit
dcb403c5c0
1 changed files with 93 additions and 65 deletions
158
lisp.js
158
lisp.js
|
|
@ -25,7 +25,7 @@ exit
|
||||||
#endif
|
#endif
|
||||||
#define var int
|
#define var int
|
||||||
#define function
|
#define function
|
||||||
#define Null 16384
|
#define Null 01000000
|
||||||
var M[Null * 2];
|
var M[Null * 2];
|
||||||
var (*funcall)();
|
var (*funcall)();
|
||||||
jmp_buf undefined;
|
jmp_buf undefined;
|
||||||
|
|
@ -68,7 +68,7 @@ function Probe(h, p) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function Hash(h, x) {
|
function Hash(h, x) {
|
||||||
return (((h + x) * 3083 + 3191) >> 4) & (Null / 2 - 1);
|
return ((h + x) * 60611 + 20485) & (Null / 2 - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
function Intern(x, y, h, p) {
|
function Intern(x, y, h, p) {
|
||||||
|
|
@ -156,6 +156,35 @@ function List(x, y) {
|
||||||
return Cons(x, Cons(y, -0));
|
return Cons(x, Cons(y, -0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function Evcon(c, a, t) {
|
||||||
|
if (c >= 0) Throw(kCond);
|
||||||
|
if (Eval(Car(Car(c)), a)) {
|
||||||
|
return Apply(Car(Cdr(Car(c))), a, t);
|
||||||
|
} else {
|
||||||
|
return Evcon(Cdr(c), a, t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function Assoc(x, y) {
|
||||||
|
var c, p;
|
||||||
|
for (c = 3; y < 0; y = M[Null + y + 1], c += 3) {
|
||||||
|
if (x == M[Null + M[Null + y]]) {
|
||||||
|
cGets += c;
|
||||||
|
return M[Null + M[Null + y] + 1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Throw(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
function Bind(x, y, u, a) {
|
||||||
|
while (x) {
|
||||||
|
a = Cons(Cons(Car(x), Arg1(y, u)), a);
|
||||||
|
x = Cdr(x);
|
||||||
|
y = Cdr(y);
|
||||||
|
}
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
function Gc(A, x) {
|
function Gc(A, x) {
|
||||||
var C, B = cx;
|
var C, B = cx;
|
||||||
x = Copy(x, A, A - B), C = cx;
|
x = Copy(x, A, A - B), C = cx;
|
||||||
|
|
@ -180,45 +209,13 @@ function Copy(x, m, k) {
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
function Assoc(x, y) {
|
function Evlam(e, a, t, f, x) {
|
||||||
if (!y) Throw(x);
|
var b, p, u, A;
|
||||||
return x == Car(Car(y)) ? Cdr(Car(y)) : Assoc(x, Cdr(y));
|
|
||||||
}
|
|
||||||
|
|
||||||
function Evcon(t, c, a) {
|
|
||||||
if (c >= 0) Throw(kCond);
|
|
||||||
if (Eval(Car(Car(c)), a)) {
|
|
||||||
return Apply(t, Car(Cdr(Car(c))), a);
|
|
||||||
} else {
|
|
||||||
return Evcon(t, Cdr(c), a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function Bind(x, y, u, a) {
|
|
||||||
return x ? Cons(Cons(Car(x), Eval(Car(y), u)),
|
|
||||||
Bind(Cdr(x), Cdr(y), u, a)) : a;
|
|
||||||
}
|
|
||||||
|
|
||||||
function Apply(t, e, a) {
|
|
||||||
var f, x, b, p, u, l, A;
|
|
||||||
if (!e) return e;
|
|
||||||
if (e > 0) return t ? e : Assoc(e, a);
|
|
||||||
f = Car(e), x = Cdr(e);
|
|
||||||
if (f == kCond) return Evcon(t, x, a);
|
|
||||||
if (t) return e;
|
|
||||||
if (f == kQuote) return Car(x);
|
|
||||||
if (f == kCons) return Cons(Eval(Car(x), a), Eval(Car(Cdr(x)), a));
|
|
||||||
if (f == kEq) return Eval(Car(x), a) == Eval(Car(Cdr(x)), a);
|
|
||||||
if (f == kAtom) return Eval(Car(x), a) >= 0;
|
|
||||||
if (f == kCar) return Car(Eval(Car(x), a));
|
|
||||||
if (f == kCdr) return Cdr(Eval(Car(x), a));
|
|
||||||
t = f;
|
|
||||||
if (f > 0) f = Assoc(f, a);
|
|
||||||
p = Car(Cdr(f));
|
p = Car(Cdr(f));
|
||||||
b = Car(Cdr(Cdr(f)));
|
b = Car(Cdr(Cdr(f)));
|
||||||
for (A = cx, u = a;;) {
|
for (A = cx, u = a;;) {
|
||||||
u = Bind(p, x, u, a);
|
u = Bind(p, x, u, a);
|
||||||
x = funcall(t, b, u);
|
x = funcall(b, u, t, a);
|
||||||
if (x < 0 && Car(x) == t) {
|
if (x < 0 && Car(x) == t) {
|
||||||
x = Gc(A, Cons(u, Cdr(x)));
|
x = Gc(A, Cons(u, Cdr(x)));
|
||||||
u = Car(x);
|
u = Car(x);
|
||||||
|
|
@ -229,36 +226,67 @@ function Apply(t, e, a) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function Apply(e, a, t) {
|
||||||
|
if (!e) return e;
|
||||||
|
if (e > 0) return t ? e : Assoc(e, a);
|
||||||
|
return Evfun(e, a, t, Car(e), Cdr(e));
|
||||||
|
}
|
||||||
|
|
||||||
|
function Evfun(e, a, t, f, x) {
|
||||||
|
if (f == kCond) return Evcon(x, a, t);
|
||||||
|
if (t) return e;
|
||||||
|
if (f == kQuote) return Car(x);
|
||||||
|
if (f == kCons) return Cons(Arg1(x, a), Arg2(x, a));
|
||||||
|
if (f == kEq) return Arg1(x, a) == Arg2(x, a);
|
||||||
|
if (f == kAtom) return Arg1(x, a) >= 0;
|
||||||
|
if (f == kCar) return Car(Arg1(x, a));
|
||||||
|
if (f == kCdr) return Cdr(Arg1(x, a));
|
||||||
|
return Evlam(e, a, f, f > 0 ? Assoc(f, a) : f, x);
|
||||||
|
}
|
||||||
|
|
||||||
|
function Arg1(x, a) {
|
||||||
|
return Eval(Car(x), a);
|
||||||
|
}
|
||||||
|
|
||||||
|
function Arg2(x, a) {
|
||||||
|
return Arg1(Cdr(x), a);
|
||||||
|
}
|
||||||
|
|
||||||
function Eval(e, a) {
|
function Eval(e, a) {
|
||||||
return Apply(0, e, a);
|
return Apply(e, a, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
function Funcall(t, e, a) {
|
function Trace(b, u, t, a) {
|
||||||
return Apply(t, e, a);
|
var i, y;
|
||||||
}
|
if (t > 0) {
|
||||||
|
Indent(depth);
|
||||||
function Funtrace(t, e, a) {
|
PrintChar(Ord('('));
|
||||||
var y;
|
Print(t);
|
||||||
Indent(depth);
|
for (i = u; i != a; i = Cdr(i)) {
|
||||||
Print(t);
|
PrintChar(Ord(' '));
|
||||||
Print(e);
|
Print(Cdr(Car(i)));
|
||||||
PrintChar(Ord('\n'));
|
}
|
||||||
depth += 2;
|
PrintChar(Ord(')'));
|
||||||
y = Funcall(t, e, a);
|
PrintChar(Ord('\r'));
|
||||||
depth -= 2;
|
PrintChar(Ord('\n'));
|
||||||
Indent(depth);
|
depth += 2;
|
||||||
Print(t);
|
}
|
||||||
Print(e);
|
y = Apply(b, u, t);
|
||||||
PrintChar(Ord(' '));
|
if (t > 0) {
|
||||||
PrintChar(0x2192);
|
depth -= 2;
|
||||||
PrintChar(Ord(' '));
|
Indent(depth);
|
||||||
Print(y);
|
Print(t);
|
||||||
PrintChar(Ord('\n'));
|
PrintChar(Ord(' '));
|
||||||
|
PrintChar(0x2192);
|
||||||
|
PrintChar(Ord(' '));
|
||||||
|
Print(y);
|
||||||
|
PrintChar(Ord('\r'));
|
||||||
|
PrintChar(Ord('\n'));
|
||||||
|
}
|
||||||
return y;
|
return y;
|
||||||
}
|
}
|
||||||
|
|
||||||
function Indent(i) {
|
function Indent(i) {
|
||||||
printf("%010d ", -cx);
|
|
||||||
for (; i; --i) {
|
for (; i; --i) {
|
||||||
PrintChar(Ord(' '));
|
PrintChar(Ord(' '));
|
||||||
}
|
}
|
||||||
|
|
@ -394,10 +422,10 @@ main(argc, argv)
|
||||||
var x, a, A;
|
var x, a, A;
|
||||||
setlocale(LC_ALL, "");
|
setlocale(LC_ALL, "");
|
||||||
bestlineSetXlatCallback(bestlineUppercase);
|
bestlineSetXlatCallback(bestlineUppercase);
|
||||||
funcall = Funcall;
|
funcall = Apply;
|
||||||
for (x = 1; x < argc; ++x) {
|
for (x = 1; x < argc; ++x) {
|
||||||
if (argv[x][0] == '-' && argv[x][1] == 't') {
|
if (argv[x][0] == '-' && argv[x][1] == 't') {
|
||||||
funcall = Funtrace;
|
funcall = Trace;
|
||||||
} else {
|
} else {
|
||||||
fputs("Usage: ", stderr);
|
fputs("Usage: ", stderr);
|
||||||
fputs(argv[0], stderr);
|
fputs(argv[0], stderr);
|
||||||
|
|
@ -629,9 +657,9 @@ function OnTrace() {
|
||||||
t = panic;
|
t = panic;
|
||||||
depth = 0;
|
depth = 0;
|
||||||
panic = 10000;
|
panic = 10000;
|
||||||
funcall = Funtrace;
|
funcall = Trace;
|
||||||
Lisp();
|
Lisp();
|
||||||
funcall = Funcall;
|
funcall = Apply;
|
||||||
panic = t;
|
panic = t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -754,7 +782,7 @@ function SetStorage(k, v) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function SetUp() {
|
function SetUp() {
|
||||||
funcall = Funcall;
|
funcall = Apply;
|
||||||
Read = Discount(Read);
|
Read = Discount(Read);
|
||||||
Print = Discount(Print);
|
Print = Discount(Print);
|
||||||
Define = Discount(Define);
|
Define = Discount(Define);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue