📄 subr.c
字号:
while (isCell(x) && car(x) == Quote && x != cdr(x)) x = cdr(x); return x;}// (split 'lst 'any ..) -> lstany doSplit(any x) { any y; int i, n = length(cdr(x = cdr(x))); cell c1, c[n], res, sub; if (!isCell(data(c1) = EVAL(car(x)))) return data(c1); Save(c1); for (i = 0; i < n; ++i) x = cdr(x), Push(c[i], EVAL(car(x))); Push(res, x = Nil); Push(sub, y = Nil); do { for (i = 0; i < n; ++i) { if (equal(car(data(c1)), data(c[i]))) { if (isNil(x)) x = data(res) = cons(data(sub), Nil); else x = cdr(x) = cons(data(sub), Nil); y = data(sub) = Nil; goto spl1; } } if (isNil(y)) y = data(sub) = cons(car(data(c1)), Nil); else y = cdr(y) = cons(car(data(c1)), Nil); spl1: ; } while (isCell(data(c1) = cdr(data(c1)))); y = cons(data(sub), Nil); drop(c1); if (isNil(x)) return y; cdr(x) = y; return data(res);}// (reverse 'lst) -> lstany doReverse(any x) { any y; cell c1; x = cdr(x), Push(c1, x = EVAL(car(x))); for (y = Nil; isCell(x); x = cdr(x)) y = cons(car(x), y); drop(c1); return y;}// (flip 'lst) -> lstany doFlip(any x) { any y, z; x = cdr(x); if (!isCell(x = EVAL(car(x))) || !isCell(y = cdr(x))) return x; cdr(x) = Nil; for (;;) { z = cdr(y), cdr(y) = x; if (!isCell(z)) return y; x = y, y = z; }}static any trim(any x) { any y; if (!isCell(x)) return x; if (isNil(y = trim(cdr(x))) && isBlank(car(x))) return Nil; return cons(car(x),y);}// (trim 'lst) -> lstany doTrim(any x) { cell c1; x = cdr(x), Push(c1, EVAL(car(x))); x = trim(data(c1)); drop(c1); return x;}// (clip 'lst) -> lstany doClip(any x) { cell c1; x = cdr(x), Push(c1, EVAL(car(x))); while (isCell(data(c1)) && isBlank(car(data(c1)))) data(c1) = cdr(data(c1)); x = trim(data(c1)); drop(c1); return x;}// (head 'cnt|lst 'lst) -> lstany doHead(any ex) { long n; any x, y; cell c1, c2; x = cdr(ex); if (isNil(data(c1) = EVAL(car(x)))) return Nil; if (isCell(data(c1))) { Save(c1); x = cdr(x); if (isCell(x = EVAL(car(x)))) { for (y = data(c1); equal(car(y), car(x)); x = cdr(x)) if (!isCell(y = cdr(y))) return Pop(c1); } drop(c1); return Nil; } if ((n = xCnt(ex,data(c1))) == 0) return Nil; x = cdr(x); if (!isCell(x = EVAL(car(x)))) return x; if (n < 0 && (n += length(x)) <= 0) return Nil; Push(c1,x); Push(c2, x = cons(car(data(c1)), Nil)); while (--n && isCell(data(c1) = cdr(data(c1)))) x = cdr(x) = cons(car(data(c1)), Nil); drop(c1); return data(c2);}// (tail 'cnt|lst 'lst) -> lstany doTail(any ex) { long n; any x, y; cell c1; x = cdr(ex); if (isNil(data(c1) = EVAL(car(x)))) return Nil; if (isCell(data(c1))) { Save(c1); x = cdr(x); if (isCell(x = EVAL(car(x)))) { do if (equal(x,data(c1))) return Pop(c1); while (isCell(x = cdr(x))); } drop(c1); return Nil; } if ((n = xCnt(ex,data(c1))) == 0) return Nil; x = cdr(x); if (!isCell(x = EVAL(car(x)))) return x; if (n < 0) return nth(1 - n, x); for (y = cdr(x); --n; y = cdr(y)) if (!isCell(y)) return x; while (isCell(y)) x = cdr(x), y = cdr(y); return x;}// (stem 'lst 'any ..) -> lstany doStem(any x) { int i, n = length(cdr(x = cdr(x))); cell c1, c[n]; Push(c1, EVAL(car(x))); for (i = 0; i < n; ++i) x = cdr(x), Push(c[i], EVAL(car(x))); for (x = data(c1); isCell(x); x = cdr(x)) { for (i = 0; i < n; ++i) if (equal(car(x), data(c[i]))) data(c1) = cdr(x); } return Pop(c1);}// (fin 'any) -> num|symany doFin(any x) { x = cdr(x), x = EVAL(car(x)); while (isCell(x)) x = cdr(x); return x;}// (last 'lst) -> anyany doLast(any x) { x = cdr(x), x = EVAL(car(x)); if (!isCell(x)) return x; while (isCell(cdr(x))) x = cdr(x); return car(x);}// (== 'any ..) -> flgany doEq(any x) { cell c1; x = cdr(x), Push(c1, EVAL(car(x))); while (isCell(x = cdr(x))) if (data(c1) != EVAL(car(x))) { drop(c1); return Nil; } drop(c1); return T;}// (n== 'any ..) -> flgany doNEq(any x) { cell c1; x = cdr(x), Push(c1, EVAL(car(x))); while (isCell(x = cdr(x))) if (data(c1) != EVAL(car(x))) { drop(c1); return T; } drop(c1); return Nil;}// (= 'any ..) -> flgany doEqual(any x) { cell c1; x = cdr(x), Push(c1, EVAL(car(x))); while (isCell(x = cdr(x))) if (!equal(data(c1), EVAL(car(x)))) { drop(c1); return Nil; } drop(c1); return T;}// (<> 'any ..) -> flgany doNEqual(any x) { cell c1; x = cdr(x), Push(c1, EVAL(car(x))); while (isCell(x = cdr(x))) if (!equal(data(c1), EVAL(car(x)))) { drop(c1); return T; } drop(c1); return Nil;}// (=0 'any) -> num | NILany doEqual0(any x) { x = cdr(x); return isNum(x = EVAL(car(x))) && IsZero(x)? x : Nil;}// (=T 'any) -> flgany doEqualT(any x) { x = cdr(x); return T == EVAL(car(x))? T : Nil;}// (n0 'any) -> flgany doNEq0(any x) { x = cdr(x); return isNum(x = EVAL(car(x))) && IsZero(x)? Nil : T;}// (nT 'any) -> flgany doNEqT(any x) { x = cdr(x); return T == EVAL(car(x))? Nil : T;}// (< 'any ..) -> flgany doLt(any x) { any y; cell c1; x = cdr(x), Push(c1, EVAL(car(x))); while (isCell(x = cdr(x))) { y = EVAL(car(x)); if (compare(data(c1), y) >= 0) { drop(c1); return Nil; } data(c1) = y; } drop(c1); return T;}// (<= 'any ..) -> flgany doLe(any x) { any y; cell c1; x = cdr(x), Push(c1, EVAL(car(x))); while (isCell(x = cdr(x))) { y = EVAL(car(x)); if (compare(data(c1), y) > 0) { drop(c1); return Nil; } data(c1) = y; } drop(c1); return T;}// (> 'any ..) -> flgany doGt(any x) { any y; cell c1; x = cdr(x), Push(c1, EVAL(car(x))); while (isCell(x = cdr(x))) { y = EVAL(car(x)); if (compare(data(c1), y) <= 0) { drop(c1); return Nil; } data(c1) = y; } drop(c1); return T;}// (>= 'any ..) -> flgany doGe(any x) { any y; cell c1; x = cdr(x), Push(c1, EVAL(car(x))); while (isCell(x = cdr(x))) { y = EVAL(car(x)); if (compare(data(c1), y) < 0) { drop(c1); return Nil; } data(c1) = y; } drop(c1); return T;}// (max 'any ..) -> anyany doMax(any x) { any y; cell c1; x = cdr(x), Push(c1, EVAL(car(x))); while (isCell(x = cdr(x))) { y = EVAL(car(x)); if (compare(y, data(c1)) > 0) data(c1) = y; } return Pop(c1);}// (min 'any ..) -> anyany doMin(any x) { any y; cell c1; x = cdr(x), Push(c1, EVAL(car(x))); while (isCell(x = cdr(x))) { y = EVAL(car(x)); if (compare(y, data(c1)) < 0) data(c1) = y; } return Pop(c1);}// (atom 'any) -> flgany doAtom(any x) { x = cdr(x); return !isCell(EVAL(car(x)))? T : Nil;}// (pair 'any) -> anyany doPair(any x) { x = cdr(x); return isCell(x = EVAL(car(x)))? x : Nil;}// (lst? 'any) -> flgany doLstQ(any x) { x = cdr(x); return isCell(x = EVAL(car(x))) || isNil(x)? T : Nil;}// (num? 'any) -> num | NILany doNumQ(any x) { x = cdr(x); return isNum(x = EVAL(car(x)))? x : Nil;}// (sym? 'any) -> flgany doSymQ(any x) { x = cdr(x); return isSym(EVAL(car(x)))? T : Nil;}// (flg? 'any) -> flgany doFlgQ(any x) { x = cdr(x); return isNil(x = EVAL(car(x))) || x==T? T : Nil;}// (member 'any 'lst) -> anyany doMember(any x) { cell c1; x = cdr(x), Push(c1, EVAL(car(x))); x = cdr(x), x = EVAL(car(x)); return member(Pop(c1), x) ?: Nil;}// (memq 'any 'lst) -> anyany doMemq(any x) { cell c1; x = cdr(x), Push(c1, EVAL(car(x))); x = cdr(x), x = EVAL(car(x)); return memq(Pop(c1), x) ?: Nil;}// (mmeq 'lst 'lst) -> anyany doMmeq(any x) { any y, z; cell c1; x = cdr(x), Push(c1, EVAL(car(x))); x = cdr(x), y = EVAL(car(x)); for (x = Pop(c1); isCell(x); x = cdr(x)) if (z = memq(car(x), y)) return z; return Nil;}// (sect 'lst 'lst) -> lstany doSect(any x) { cell c1, c2, c3; x = cdr(x), Push(c1, EVAL(car(x))); x = cdr(x), Push(c2, EVAL(car(x))); Push(c3, x = Nil); while (isCell(data(c1))) { if (member(car(data(c1)), data(c2))) if (isNil(x)) x = data(c3) = cons(car(data(c1)), Nil); else x = cdr(x) = cons(car(data(c1)), Nil); data(c1) = cdr(data(c1)); } drop(c1); return data(c3);}// (diff 'lst 'lst) -> lstany doDiff(any x) { cell c1, c2, c3; x = cdr(x), Push(c1, EVAL(car(x))); x = cdr(x), Push(c2, EVAL(car(x))); Push(c3, x = Nil); while (isCell(data(c1))) { if (!member(car(data(c1)), data(c2))) if (isNil(x)) x = data(c3) = cons(car(data(c1)), Nil); else x = cdr(x) = cons(car(data(c1)), Nil); data(c1) = cdr(data(c1)); } drop(c1); return data(c3);}// (index 'any 'lst) -> cnt | NILany doIndex(any x) { int n; cell c1; x = cdr(x), Push(c1, EVAL(car(x))); x = cdr(x), x = EVAL(car(x)); if (n = indx(Pop(c1), x)) return boxCnt(n); return Nil;}// (offset 'lst1 'lst2) -> cnt | NILany doOffset(any x) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -