Annotation of 43BSD/ucb/lisp/franz/fex2.c, revision 1.1

1.1     ! root        1: 
        !             2: #ifndef lint
        !             3: static char *rcsid =
        !             4:    "$Header: fex2.c,v 1.3 83/09/07 17:55:38 sklower Exp $";
        !             5: #endif
        !             6: 
        !             7: /*                                     -[Mon Jan 31 21:54:52 1983 by layer]-
        !             8:  *     fex2.c                          $Locker:  $
        !             9:  * nlambda functions
        !            10:  *
        !            11:  * (c) copyright 1982, Regents of the University of California
        !            12:  */
        !            13: 
        !            14: #include "global.h"
        !            15: #define NDOVARS 30
        !            16: #include "frame.h"
        !            17: 
        !            18: /*
        !            19:  * Ndo  maclisp do function.
        !            20:  */
        !            21: lispval
        !            22: Ndo()
        !            23: {
        !            24:        register lispval current, where, handy;
        !            25:        register struct nament *mybnp;
        !            26:        lispval temp, atom;
        !            27:        lispval body, endtest, endform, varstuff, renewals[NDOVARS] ;
        !            28:        struct argent *getem, *startnp;  
        !            29:        struct nament *savedbnp = bnp;
        !            30:        int count, repeatdo, index;
        !            31:        extern struct frame *errp;
        !            32:        pbuf pb;
        !            33:        Savestack(3);
        !            34: 
        !            35:        current = lbot->val;
        !            36:        varstuff = current->d.car;
        !            37: 
        !            38:        switch( TYPE(varstuff) ) {
        !            39: 
        !            40:        case ATOM:                      /* This is old style maclisp do;
        !            41:                                           atom is var, cadr(current) = init;
        !            42:                                           caddr(current) = repeat etc. */
        !            43:                if(varstuff==nil) goto newstyle;
        !            44:                current = current->d.cdr;       /* car(current) is now init */
        !            45:                PUSHDOWN(varstuff,eval(current->d.car));
        !            46:                                        /* Init var.        */
        !            47:                *renewals = (current = current->d.cdr)->d.car;
        !            48:                                        /* get repeat form  */
        !            49:                endtest = (current = current->d.cdr)->d.car;
        !            50:                body = current->d.cdr;
        !            51: 
        !            52:                errp = Pushframe(F_PROG,nil,nil);
        !            53: 
        !            54:                switch (retval) {
        !            55:                    case C_RET: /*
        !            56:                                 * returning from this prog, value to return
        !            57:                                 * is in lispretval
        !            58:                                 */
        !            59:                                errp = Popframe();
        !            60:                                popnames(savedbnp);
        !            61:                                return(lispretval);
        !            62: 
        !            63:                    case C_GO:  /*
        !            64:                                 * going to a certain label, label to go to in
        !            65:                                 * in lispretval
        !            66:                                 */
        !            67:                                where = body;
        !            68:                                while ((TYPE(where) == DTPR) 
        !            69:                                        & (where->d.car != lispretval))
        !            70:                                where = where->d.cdr;
        !            71:                                if (where->d.car == lispretval) {
        !            72:                                        popnames(errp->svbnp);
        !            73:                                        where = where->d.cdr;
        !            74:                                        goto singbody;
        !            75:                                }
        !            76:                                /* label not found in this prog, must 
        !            77:                                 * go up to higher prog
        !            78:                                 */
        !            79:                                Inonlocalgo(C_GO,lispretval,nil);
        !            80: 
        !            81:                                /* NOT REACHED */
        !            82: 
        !            83:                    case C_INITIAL: break;      /* fall through */
        !            84: 
        !            85:                }
        !            86: 
        !            87:            singtop:
        !            88:                    if(eval(endtest)!=nil) {
        !            89:                        errp = Popframe();
        !            90:                        popnames(savedbnp);
        !            91:                        return(nil);
        !            92:                    }
        !            93:                    where = body;
        !            94:                    
        !            95:            singbody:
        !            96:                    while (TYPE(where) == DTPR)
        !            97:                    {
        !            98:                        temp = where->d.car;
        !            99:                        if((TYPE(temp))!=ATOM) eval(temp);
        !           100:                        where = where->d.cdr;
        !           101:                    }
        !           102:                    varstuff->a.clb = eval(*renewals);
        !           103:                    goto singtop;
        !           104:        
        !           105: 
        !           106:        newstyle:
        !           107:        case DTPR:                      /* New style maclisp do; atom is
        !           108:                                           list of things of the form
        !           109:                                           (var init repeat)            */
        !           110:                count = 0;
        !           111:                startnp = np;
        !           112:                for(where = varstuff; where != nil; where = where->d.cdr) {
        !           113:                                        /* do inits and count do vars. */
        !           114:                                        /* requires "simultaneous" eval
        !           115:                                           of all inits                 */
        !           116:                        while (TYPE(where->d.car) != DTPR)
        !           117:                          where->d.car =
        !           118:                             errorh1(Vermisc,"do: variable forms must be lists ",
        !           119:                             nil,TRUE,0,where->d.car);
        !           120:                        handy = where->d.car->d.cdr;
        !           121:                        temp = nil;
        !           122:                        if(handy !=nil)
        !           123:                                temp = eval(handy->d.car);
        !           124:                        protect(temp);
        !           125:                        count++;
        !           126:                }
        !           127:                if(count > NDOVARS)
        !           128:                        error("More than 15 do vars",FALSE);
        !           129:                where = varstuff;
        !           130:                getem = startnp;        /* base of stack of init forms */
        !           131:                for(index = 0; index < count; index++) {
        !           132: 
        !           133:                        handy = where->d.car;
        !           134:                                        /* get var name from group      */
        !           135: 
        !           136:                        atom = handy->d.car;
        !           137:                        while((TYPE(atom) != ATOM) || (atom == nil))
        !           138:                          atom = errorh1(Vermisc,"do variable must be a non nil symbol ",
        !           139:                                                    nil,TRUE,0,atom);
        !           140:                        PUSHDOWN(atom,getem->val);
        !           141:                        getem++;
        !           142:                        handy = handy->d.cdr->d.cdr;
        !           143:                        if(handy==nil)
        !           144:                                handy = CNIL;  /* be sure not to rebind later */
        !           145:                        else
        !           146:                                handy = handy->d.car;
        !           147:                        renewals[index] = handy;
        !           148: 
        !           149:                                        /* more loop "increments" */
        !           150:                        where = where->d.cdr;
        !           151:                }
        !           152:                np = startnp;           /* pop off all init forms */
        !           153:                                        /* Examine End test and End form */
        !           154:                current = current->d.cdr;
        !           155:                handy = current->d.car;
        !           156:                body = current->d.cdr;
        !           157: 
        !           158:                /* 
        !           159:                 * a do form with a test of nil just does the body once
        !           160:                 * and returns nil
        !           161:                 */
        !           162:                if (handy == nil) repeatdo = 1; /* just do it once */
        !           163:                else repeatdo = -1;             /* do it forever   */
        !           164: 
        !           165:                endtest = handy->d.car;
        !           166:                endform = handy->d.cdr;
        !           167: 
        !           168:                where = body;
        !           169: 
        !           170:                errp = Pushframe(F_PROG,nil,nil);
        !           171:                while(TRUE) {
        !           172: 
        !           173:                    switch (retval) {
        !           174:                    case C_RET: /*
        !           175:                                 * returning from this prog, value to return
        !           176:                                 * is in lispretval
        !           177:                                 */
        !           178:                                errp = Popframe();
        !           179:                                popnames(savedbnp);
        !           180:                                Restorestack();
        !           181:                                return(lispretval);
        !           182: 
        !           183:                    case C_GO:  /*
        !           184:                                 * going to a certain label, label to go to in
        !           185:                                 * in lispretval
        !           186:                                 */
        !           187:                                where = body;
        !           188:                                while ((TYPE(where) == DTPR) 
        !           189:                                        & (where->d.car != lispretval))
        !           190:                                where = where->d.cdr;
        !           191:                                if (where->d.car == lispretval) {
        !           192:                                        popnames(errp->svbnp);
        !           193:                                        where = where->d.cdr;
        !           194:                                        goto bodystart;
        !           195:                                }
        !           196:                                /* label not found in this prog, must 
        !           197:                                 * go up to higher prog
        !           198:                                 */
        !           199:                                Inonlocalgo(C_GO,lispretval,nil);
        !           200: 
        !           201:                                /* NOT REACHED */
        !           202: 
        !           203:                    case C_INITIAL: break;      /* fall through */
        !           204: 
        !           205:                    }
        !           206: 
        !           207:            loop:
        !           208:                    np = startnp;       /* is bumped when doing repeat forms */
        !           209: 
        !           210:                    if((repeatdo-- == 0) || (eval(endtest) !=nil)) {
        !           211:                        for(handy = nil; endform!=nil; endform = endform->d.cdr)
        !           212:                        {
        !           213:                                handy = eval(endform->d.car);
        !           214:                        }
        !           215:                        errp = Popframe();
        !           216:                        popnames(savedbnp);
        !           217:                        Restorestack();
        !           218:                        return(handy);
        !           219:                    }
        !           220:                    
        !           221:            bodystart:
        !           222:                    while (TYPE(where) == DTPR)
        !           223:                    {
        !           224:                        temp = where->d.car;
        !           225:                        if((TYPE(temp))!=ATOM) eval(temp);
        !           226:                        where = where->d.cdr;
        !           227:                    }
        !           228:                    where = body;
        !           229:                    getem = np = startnp;
        !           230:                                        /* Simultaneously eval repeat forms */
        !           231:                    for(index = 0; index < count; index++) {
        !           232:                        temp = renewals[index];
        !           233:                        if (temp == nil || temp == CNIL)
        !           234:                                protect(temp);
        !           235:                        else
        !           236:                                protect(eval(temp));
        !           237:                    }
        !           238:                                        /* now simult. rebind all the atoms */
        !           239:                    mybnp = savedbnp;
        !           240:                    for(index = 0; index < count; index++) 
        !           241:                    {
        !           242:                       if( getem->val != CNIL )  /* if this atom has a repeat */
        !           243:                        mybnp->atm->a.clb = (getem)->val;  /* rebind */
        !           244:                        mybnp++;
        !           245:                        getem++;
        !           246:                    }
        !           247:                    goto loop;
        !           248:                }
        !           249:            default:
        !           250:                error("do: neither list nor atom follows do", FALSE);
        !           251:            }
        !           252:                /* NOTREACHED */
        !           253: }
        !           254: 
        !           255: lispval
        !           256: Nprogv()
        !           257: {
        !           258:        register lispval where, handy;
        !           259:        register struct nament *namptr;
        !           260:        register struct argent *vars;
        !           261:        struct nament *oldbnp = bnp;
        !           262:        Savestack(4);
        !           263: 
        !           264:        where = lbot->val;
        !           265:        protect(eval(where->d.car));            /* list of vars = lbot[1].val */
        !           266:        protect(eval((where = where->d.cdr)->d.car));
        !           267:                                                /* list of vals */
        !           268:        handy = lbot[2].val;
        !           269:        namptr = oldbnp;
        !           270:                                                /* simultaneous eval of all
        !           271:                                                   args */
        !           272:        for(;handy!=nil; handy = handy->d.cdr) {
        !           273:                (np++)->val = (handy->d.car);
        !           274:                /*  Note, each element should not be reevaluated like it 
        !           275:                 *  was  before.  - dhl */
        !           276:                /* Before: (np++)->val = eval(handy->d.car);*/
        !           277:                TNP;
        !           278:        }
        !           279:        /*asm("# Here is where rebinding is done");      /* very cute */
        !           280:        for(handy=lbot[1].val,vars=lbot+3; handy!=nil; handy=handy->d.cdr) {
        !           281:            namptr->atm = handy->d.car;
        !           282:            ++namptr;                           /* protect against interrupts
        !           283:                                                   while re-lambda binding */
        !           284:            bnp = namptr;
        !           285:            namptr[-1].atm = handy->d.car;
        !           286:            namptr[-1].val = handy->d.car->a.clb;
        !           287:            if(vars < np)
        !           288:                handy->d.car->a.clb = vars++->val;
        !           289:            else
        !           290:                handy->d.car->a.clb = nil;
        !           291:        }
        !           292:                
        !           293:        handy = nil;
        !           294:        for(where = where->d.cdr; where != nil; where = where->d.cdr)
        !           295:                handy = eval(where->d.car);
        !           296:        popnames(oldbnp);
        !           297:        Restorestack();
        !           298:        return(handy);
        !           299: }
        !           300: 
        !           301: lispval
        !           302: Nprogn()
        !           303: {
        !           304:        register lispval result, where;
        !           305: 
        !           306:        result = nil;
        !           307:        for(where = lbot->val; where != nil; where = where->d.cdr)
        !           308:                result = eval(where->d.car);
        !           309:        return(result);
        !           310: 
        !           311: 
        !           312: }
        !           313: lispval
        !           314: Nprog2()
        !           315: {
        !           316:        register lispval result, where;
        !           317: 
        !           318:        where = lbot->val; 
        !           319:        eval(where->d.car);
        !           320:        result = eval((where = where->d.cdr)->d.car);
        !           321:        protect(result);
        !           322:        for(where = where->d.cdr; where != nil; where = where->d.cdr)
        !           323:                eval(where->d.car);
        !           324:        np--;
        !           325:        return(result);
        !           326: }
        !           327: lispval
        !           328: typred(typ,ptr)
        !           329: int    typ;
        !           330: lispval        ptr;
        !           331: 
        !           332: {   int tx;
        !           333:        if ((tx = TYPE(ptr)) == typ) return(tatom);
        !           334:        if ((tx == INT) && (typ == ATOM)) return(tatom);
        !           335:        return(nil);
        !           336: }
        !           337: 
        !           338: /*
        !           339:  * function
        !           340:  * In the interpreter, function is the same as quote
        !           341:  */
        !           342: lispval
        !           343: Nfunction()
        !           344: {
        !           345:        if((lbot->val == nil) || (lbot->val->d.cdr != nil))
        !           346:                argerr("function");
        !           347:        return(lbot->val->d.car);
        !           348: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.