|
|
1.1 ! root 1: #include "global.h" ! 2: #define NDOVARS 15 ! 3: #include <assert.h> ! 4: /* ! 5: * Ndo maclisp do function. ! 6: */ ! 7: lispval ! 8: Ndo() ! 9: { ! 10: register lispval current, where, handy; ! 11: register struct nament *mybnp; ! 12: register struct argent *lbot, *np; ! 13: lispval atom, temp; ! 14: lispval body, endtest, endform, varstuf, renewals[NDOVARS] ; ! 15: struct argent *start, *last, *getem, *savedlbot; ! 16: struct nament *savedbnp, *lastbnd; ! 17: int count, index, saveme[SAVSIZE], virgin = 1; ! 18: int myerrp; extern int errp; ! 19: ! 20: savedlbot = lbot; ! 21: myerrp = errp; ! 22: savedbnp = bnp; ! 23: getexit(saveme); /* common nonlocal return */ ! 24: if(retval = setexit()) { ! 25: errp = myerrp; ! 26: if(retval == BRRETN) { ! 27: resexit(saveme); ! 28: lbot = savedlbot; ! 29: popnames(savedbnp); ! 30: return((lispval) contval); ! 31: } else { ! 32: resexit(saveme); ! 33: lbot = savedlbot; ! 34: reset(retval); ! 35: } ! 36: } ! 37: current = lbot->val; ! 38: varstuf = current->car; ! 39: switch( TYPE(varstuf) ) { ! 40: ! 41: case ATOM: /* This is old style maclisp do; ! 42: atom is var, cadr(current) = init; ! 43: caddr(current) = repeat etc. */ ! 44: atom = varstuf; ! 45: if(varstuf==nil) goto newstyle; ! 46: bnp->atm = atom; /* save current binding of atom */ ! 47: bnp++->val = atom->clb; ! 48: if(bnp > bnplim) ! 49: binderr(); ! 50: current = current->cdr; ! 51: atom->clb = eval(current->car); ! 52: /* Init var. */ ! 53: *renewals = (current = current->cdr)->car; ! 54: /* get repeat form */ ! 55: endtest = (current = current->cdr)->car; ! 56: body = current->cdr; ! 57: ! 58: while(TRUE) { ! 59: if(eval(endtest)!=nil) { ! 60: resexit(saveme); ! 61: popnames(savedbnp); ! 62: return(nil); ! 63: } ! 64: doprog(body); ! 65: atom->clb = eval(*renewals); ! 66: } ! 67: ! 68: ! 69: newstyle: ! 70: case DTPR: /* New style maclisp do; atom is ! 71: list of things of the form ! 72: (var init repeat) */ ! 73: count = 0; ! 74: start = np; ! 75: for(where = varstuf; where != nil; where = where->cdr) { ! 76: /* do inits and count do vars. */ ! 77: /* requires "simultaneous" eval ! 78: of all inits */ ! 79: handy = where->car->cdr; ! 80: temp = nil; ! 81: if(handy !=nil) ! 82: temp = eval(handy->car); ! 83: protect(temp); ! 84: count++; ! 85: } ! 86: if(count > NDOVARS) ! 87: error("More than 15 do vars",FALSE); ! 88: bnp += count; ! 89: if(bnp >= bnplim) { ! 90: bnp = savedbnp; ! 91: namerr(); ! 92: } ! 93: last = np; ! 94: where = varstuf; ! 95: mybnp = savedbnp; ! 96: getem = start; ! 97: for(index = 0; index < count; index++) { ! 98: ! 99: handy = where->car; ! 100: /* get var name from group */ ! 101: atom = handy->car; ! 102: mybnp->atm = atom; ! 103: mybnp->val = atom->clb; ! 104: /* Swap current binding of atom ! 105: for init val pushed on stack */ ! 106: ! 107: atom->clb = getem++->val; ! 108: /* As long as we are down here in the ! 109: list, save repeat form */ ! 110: handy = handy->cdr->cdr; ! 111: if(handy==nil) ! 112: handy = CNIL; /* be sure not to rebind later */ ! 113: else ! 114: handy = handy->car; ! 115: renewals[index] = handy; ! 116: ! 117: /* more loop "increments" */ ! 118: where = where->cdr; ! 119: mybnp++; ! 120: } ! 121: /* Examine End test and End form */ ! 122: current = current->cdr; ! 123: handy = current->car; ! 124: body = current->cdr; ! 125: if (handy == nil) { ! 126: doprog(body); ! 127: popnames(savedbnp); ! 128: resexit(saveme); ! 129: return(nil); ! 130: } ! 131: endtest = handy->car; ! 132: endform = handy->cdr; ! 133: /* The following is the loop: */ ! 134: loop: ! 135: if(eval(endtest)!=nil) { ! 136: for(handy = nil; endform!=nil; endform = endform->cdr){ ! 137: handy = eval(endform->car); ! 138: } ! 139: resexit(saveme); ! 140: popnames(savedbnp); ! 141: return(handy); ! 142: } ! 143: doprog(body); ! 144: /* Simultaneously eval repeat forms */ ! 145: for(index = 0; index < count; index++) { ! 146: ! 147: temp = renewals[index]; ! 148: if (temp == nil || temp == CNIL) ! 149: protect(temp); ! 150: else ! 151: protect(eval(temp)); ! 152: } ! 153: getem = (np = last); ! 154: /* now simult. rebind all the atoms */ ! 155: mybnp = savedbnp; ! 156: for(index = 0; index < count; index++, getem++) { ! 157: if( (getem)->val != CNIL ) /* if this atom has a repeat form */ ! 158: mybnp->atm->clb = (getem)->val; /* rebind */ ! 159: mybnp++; ! 160: } ! 161: goto loop; ! 162: } ! 163: } ! 164: doprog(body) ! 165: register lispval body; ! 166: { ! 167: int saveme[SAVSIZE]; ! 168: register lispval where, temp; ! 169: /*register struct nament *savednp = np, *savedlbot = lbot;*/ ! 170: extern int errp; int myerrp = errp; ! 171: struct nament *savedbnp = bnp; ! 172: snpand(2); ! 173: ! 174: where = body; ! 175: getexit(saveme); ! 176: if(retval = setexit()) { ! 177: errp = myerrp; ! 178: switch (retval) { ! 179: ! 180: default: resexit(saveme); ! 181: reset(retval); ! 182: ! 183: case BRGOTO: ! 184: for(where = body; ! 185: where->car != (lispval) contval; where = where->cdr) { ! 186: ! 187: if(where==nil) { ! 188: resexit(saveme); ! 189: reset(retval); ! 190: } ! 191: /* np is automatically restored here by ! 192: virtue of being a register */ ! 193: } ! 194: popnames(savedbnp); ! 195: } ! 196: } ! 197: while (TYPE(where) == DTPR) { ! 198: temp = where->car; ! 199: if((TYPE(temp))!=ATOM) eval(temp); ! 200: where = where->cdr; ! 201: } ! 202: resexit(saveme); ! 203: } ! 204: lispval ! 205: Nprogv() ! 206: { ! 207: register lispval argptr, where, handy, atoms; ! 208: register struct argent *lbot, *np; ! 209: struct argent *namptr, *start; ! 210: struct nament *oldbnp = bnp; ! 211: ! 212: where = lbot->val; ! 213: protect(eval(where->car)); /* list of vars */ ! 214: atoms = lbot[1].val; ! 215: protect(eval((where = where->cdr)->car)); ! 216: /* list of vals */ ! 217: handy = lbot[2].val; ! 218: start = np; ! 219: for(;handy!=nil; handy = handy->cdr) { ! 220: (np++)->val = eval(handy->car); ! 221: TNP; ! 222: } ! 223: rebind(atoms,start); ! 224: handy = nil; ! 225: for(where = where->cdr; where != nil; where = where->cdr) ! 226: handy = eval(where->car); ! 227: popnames(oldbnp); ! 228: return(handy); ! 229: } ! 230: ! 231: lispval ! 232: Nprogn() ! 233: { ! 234: register lispval result, where; ! 235: snpand(2); ! 236: ! 237: result = nil; ! 238: for(where = lbot->val; where != nil; where = where->cdr) ! 239: result = eval(where->car); ! 240: return(result); ! 241: ! 242: ! 243: } ! 244: lispval ! 245: Nprog2() ! 246: { ! 247: register lispval result, where; ! 248: snpand(2); ! 249: ! 250: where = lbot->val; ! 251: eval(where->car); ! 252: result = eval((where = where->cdr)->car); ! 253: protect(result); ! 254: for(where = where->cdr; where != nil; where = where->cdr) ! 255: eval(where->car); ! 256: return(result); ! 257: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.