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

📄 subr.c

📁 A very small LISP implementation with several packages and demo programs.
💻 C
📖 第 1 页 / 共 3 页
字号:
/* 10oct07abu * (c) Software Lab. Alexander Burger */#include "pico.h"// (c...r 'lst) -> anyany doCar(any ex) {   any x = cdr(ex);   x = EVAL(car(x));   NeedLst(ex,x);   return car(x);}any doCdr(any ex) {   any x = cdr(ex);   x = EVAL(car(x));   NeedLst(ex,x);   return cdr(x);}any doCaar(any ex) {   any x = cdr(ex);   x = EVAL(car(x));   NeedLst(ex,x);   return caar(x);}any doCadr(any ex) {   any x = cdr(ex);   x = EVAL(car(x));   NeedLst(ex,x);   return cadr(x);}any doCdar(any ex) {   any x = cdr(ex);   x = EVAL(car(x));   NeedLst(ex,x);   return cdar(x);}any doCddr(any ex) {   any x = cdr(ex);   x = EVAL(car(x));   NeedLst(ex,x);   return cddr(x);}any doCaaar(any ex) {   any x = cdr(ex);   x = EVAL(car(x));   NeedLst(ex,x);   return caaar(x);}any doCaadr(any ex) {   any x = cdr(ex);   x = EVAL(car(x));   NeedLst(ex,x);   return caadr(x);}any doCadar(any ex) {   any x = cdr(ex);   x = EVAL(car(x));   NeedLst(ex,x);   return cadar(x);}any doCaddr(any ex) {   any x = cdr(ex);   x = EVAL(car(x));   NeedLst(ex,x);   return caddr(x);}any doCdaar(any ex) {   any x = cdr(ex);   x = EVAL(car(x));   NeedLst(ex,x);   return cdaar(x);}any doCdadr(any ex) {   any x = cdr(ex);   x = EVAL(car(x));   NeedLst(ex,x);   return cdadr(x);}any doCddar(any ex) {   any x = cdr(ex);   x = EVAL(car(x));   NeedLst(ex,x);   return cddar(x);}any doCdddr(any ex) {   any x = cdr(ex);   x = EVAL(car(x));   NeedLst(ex,x);   return cdddr(x);}any doCadddr(any ex) {   any x = cdr(ex);   x = EVAL(car(x));   NeedLst(ex,x);   return cadddr(x);}any doCddddr(any ex) {   any x = cdr(ex);   x = EVAL(car(x));   NeedLst(ex,x);   return cddddr(x);}// (nth 'lst 'cnt ..) -> lstany doNth(any ex) {   any x;   cell c1;   x = cdr(ex),  Push(c1, EVAL(car(x))),  x = cdr(x);   for (;;) {      if (!isCell(data(c1)))         return Pop(c1);      data(c1) = nth((int)evCnt(ex,x), data(c1));      if (!isCell(x = cdr(x)))         return Pop(c1);      data(c1) = car(data(c1));   }}// (con 'lst 'any) -> anyany doCon(any ex) {   any x;   cell c1;   x = cdr(ex),  Push(c1, EVAL(car(x)));   NeedCell(ex,data(c1));   x = cdr(x),  x = cdr(data(c1)) = EVAL(car(x));   drop(c1);   return x;}// (cons 'any ['any ..]) -> lstany doCons(any x) {   any y;   cell c1;   x = cdr(x);   Push(c1, y = cons(EVAL(car(x)),Nil));   while (isCell(cdr(x = cdr(x))))      y = cdr(y) = cons(EVAL(car(x)),Nil);   cdr(y) = EVAL(car(x));   return Pop(c1);}// (conc 'lst ..) -> lstany doConc(any x) {   any y, z;   cell c1;   x = cdr(x),  Push(c1, y = EVAL(car(x)));   while (isCell(x = cdr(x))) {      z = EVAL(car(x));      if (!isCell(y))         y = data(c1) = z;      else {         while (isCell(cdr(y)))            y = cdr(y);         cdr(y) = z;      }   }   return Pop(c1);}// (circ 'any ..) -> lstany doCirc(any x) {   any y;   cell c1;   x = cdr(x);   Push(c1, y = cons(EVAL(car(x)),Nil));   while (isCell(x = cdr(x)))      y = cdr(y) = cons(EVAL(car(x)),Nil);   cdr(y) = data(c1);   return Pop(c1);}// (rot 'lst ['cnt]) -> lstany doRot(any ex) {   any x, y, z;   int n;   cell c1;   x = cdr(ex),  Push(c1, y = EVAL(car(x)));   if (isCell(y)) {      n = isCell(x = cdr(x))? evCnt(ex,x) : 0;      x = car(y);      while (--n  &&  isCell(y = cdr(y))  &&  y != data(c1))         z = car(y),  car(y) = x,  x = z;      car(data(c1)) = x;   }   return Pop(c1);}// (list 'any ..) -> lstany doList(any x) {   any y;   cell c1;   x = cdr(x);   Push(c1, y = cons(EVAL(car(x)),Nil));   while (isCell(x = cdr(x)))      y = cdr(y) = cons(EVAL(car(x)),Nil);   return Pop(c1);}// (need 'cnt ['lst ['any]]) -> lstany doNeed(any ex) {   int n;   any x;   cell c1, c2;   n = (int)evCnt(ex, x = cdr(ex));   x = cdr(x),  Push(c1, EVAL(car(x)));   Push(c2, EVAL(cadr(x)));   x = data(c1);   if (n > 0)      for (n -= length(x); n > 0; --n)         data(c1) = cons(data(c2), data(c1));   else if (n) {      if (!isCell(x))         data(c1) = x = cons(data(c2),Nil);      else         while (isCell(cdr(x)))            ++n,  x = cdr(x);      while (++n < 0)         x = cdr(x) = cons(data(c2),Nil);   }   return Pop(c1);}// (full 'any) -> boolany doFull(any x) {   x = cdr(x);   for (x = EVAL(car(x)); isCell(x); x = cdr(x))      if (isNil(car(x)))         return Nil;   return T;}// (make .. [(made 'lst ..)] .. [(link 'any ..)] ..) -> anyany doMake(any x) {   any make;   cell c1, c2;   if (make = Env.make)      Push(c1, car(make));   Env.make = &c2,  c2.car = Nil;   while (isCell(x = cdr(x)))      if (isCell(car(x)))         evList(car(x));   if (Env.make = make)      drop(c1);   return c2.car;}static void makeError(any ex) {err(ex, NULL, "Not making");}// (made ['lst1 ['lst2]]) -> lstany doMade(any x) {   if (!Env.make)      makeError(x);   if (isCell(x = cdr(x))) {      car(Env.make) = EVAL(car(x));      if (x = cdr(x), !isCell(x = EVAL(car(x))))         for (x = car(Env.make);  isCell(cdr(x));  x = cdr(x));      cdr(Env.make) = x;   }   return car(Env.make);}// (chain 'lst ..) -> lstany doChain(any x) {   any y;   if (!Env.make)      makeError(x);   x = cdr(x);   do {      if (isCell(y = EVAL(car(x)))) {         if (isCell(car(Env.make)))            cddr(Env.make) = y;         else            car(Env.make) = y;         cdr(Env.make) = y;         while (isCell(cddr(Env.make)))            cdr(Env.make) = cddr(Env.make);      }   } while (isCell(x = cdr(x)));   return y;}// (link 'any ..) -> anyany doLink(any x) {   any y, z;   if (!Env.make)      makeError(x);   x = cdr(x);   do {      y = cons(z = EVAL(car(x)), Nil);      if (isCell(car(Env.make)))         cddr(Env.make) = y;      else         car(Env.make) = y;      cdr(Env.make) = y;   } while (isCell(x = cdr(x)));   return z;}// (yoke 'any ..) -> anyany doYoke(any x) {   any y;   if (!Env.make)      makeError(x);   x = cdr(x);   do {      if (isCell(car(Env.make)))         car(Env.make) = cons(y = EVAL(car(x)), car(Env.make));      else         car(Env.make) = cdr(Env.make) = cons(y = EVAL(car(x)), Nil);   } while (isCell(x = cdr(x)));   return y;}// (copy 'any) -> anyany doCopy(any x) {   any y, z;   cell c1;   x = cdr(x);   if (!isCell(x = EVAL(car(x))))      return x;   Push(c1, y = cons(car(x), cdr(z = x)));   while (isCell(x = cdr(x))) {      if (x == z) {         cdr(y) = data(c1);         break;      }      y = cdr(y) = cons(car(x),cdr(x));   }   return Pop(c1);}// (mix 'lst cnt|'any ..) -> lstany doMix(any x) {   any y;   cell c1, c2;   x = cdr(x);   if (!isCell(data(c1) = EVAL(car(x))) && !isNil(data(c1)))      return data(c1);   if (!isCell(x = cdr(x)))      return Nil;   Save(c1);   Push(c2,      y = cons(         isNum(car(x))? car(nth((int)unBox(car(x)),data(c1))) : EVAL(car(x)),         Nil ) );   while (isCell(x = cdr(x)))      y = cdr(y) = cons(         isNum(car(x))? car(nth((int)unBox(car(x)),data(c1))) : EVAL(car(x)),         Nil );   drop(c1);   return data(c2);}// (append 'lst ..) -> lstany doAppend(any x) {   any y;   cell c1, c2;   while (isCell(cdr(x = cdr(x)))) {      if (isCell(data(c1) = EVAL(car(x)))) {         Save(c1);         Push(c2, y = cons(car(data(c1)),cdr(data(c1))));         while (isCell(data(c1) = cdr(data(c1))))            y = cdr(y) = cons(car(data(c1)),cdr(data(c1)));         while (isCell(cdr(x = cdr(x)))) {            data(c1) = EVAL(car(x));            while (isCell(data(c1))) {               y = cdr(y) = cons(car(data(c1)),cdr(data(c1)));               data(c1) = cdr(data(c1));            }            cdr(y) = data(c1);         }         cdr(y) = EVAL(car(x));         drop(c1);         return data(c2);      }   }   return EVAL(car(x));}// (delete 'any 'lst) -> lstany doDelete(any x) {   any y, z;   cell c1, c2, c3;   x = cdr(x),  Push(c1, y = EVAL(car(x)));   x = cdr(x);   if (!isCell(x = EVAL(car(x)))) {      drop(c1);      return x;   }   if (equal(y, car(x))) {      drop(c1);      return cdr(x);   }   Push(c2, x);   Push(c3, z = cons(car(x), Nil));   while (isCell(x = cdr(x))) {      if (equal(y, car(x))) {         cdr(z) = cdr(x);         drop(c1);         return data(c3);      }      z = cdr(z) = cons(car(x), Nil);   }   cdr(z) = x;   drop(c1);   return data(c3);}// (delq 'any 'lst) -> lstany doDelq(any x) {   any y, z;   cell c1, c2, c3;   x = cdr(x),  Push(c1, y = EVAL(car(x)));   x = cdr(x);   if (!isCell(x = EVAL(car(x)))) {      drop(c1);      return x;   }   if (y == car(x)) {      drop(c1);      return cdr(x);   }   Push(c2, x);   Push(c3, z = cons(car(x), Nil));   while (isCell(x = cdr(x))) {      if (y == car(x)) {         cdr(z) = cdr(x);         drop(c1);         return data(c3);      }      z = cdr(z) = cons(car(x), Nil);   }   cdr(z) = x;   drop(c1);   return data(c3);}// (replace 'lst 'any1 'any2 ..) -> lstany doReplace(any x) {   any y;   int i, n = length(cdr(x = cdr(x))) + 1 & ~1;   cell c1, c2, c[n];   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)));   for (i = 0;  i < n;  i += 2)      if (equal(car(data(c1)), data(c[i]))) {         x = data(c[i+1]);         goto rpl1;      }   x = car(data(c1));rpl1:   Push(c2, y = cons(x,Nil));   while (isCell(data(c1) = cdr(data(c1)))) {      for (i = 0;  i < n;  i += 2)         if (equal(car(data(c1)), data(c[i]))) {            x = data(c[i+1]);            goto rpl2;         }      x = car(data(c1));   rpl2:      y = cdr(y) = cons(x, Nil);   }   cdr(y) = data(c1);   drop(c1);   return data(c2);}// (strip 'any) -> anyany doStrip(any x) {   x = cdr(x),  x = EVAL(car(x));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -