⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subr.c

📁 A very small LISP implementation with several packages and demo programs.
💻 C
📖 第 1 页 / 共 3 页
字号:
   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 + -