Annotation of 43BSD/ucb/lisp/franz/lam2.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char *rcsid =
                      3:    "$Header: lam2.c,v 1.5 83/12/09 16:35:49 sklower Exp $";
                      4: #endif
                      5: 
                      6: /*                                     -[Fri Aug  5 12:46:16 1983 by jkf]-
                      7:  *     lam2.c                          $Locker:  $
                      8:  * lambda functions
                      9:  *
                     10:  * (c) copyright 1982, Regents of the University of California
                     11:  */
                     12: 
                     13: # include "global.h"
                     14: # include <signal.h>
                     15: # include "structs.h"
                     16: # include "chars.h"
                     17: # include "chkrtab.h"
                     18: /*
                     19:  * (flatc 'thing ['max]) returns the smaller of max and the number of chars
                     20:  * required to print thing linearly.
                     21:  * if max argument is not given, we assume the second arg is infinity
                     22:  */
                     23: static flen; /*Internal to this module, used as a running counter of flatsize*/
                     24: static fmax; /*used for maximum for quick reference */
                     25: char *strcpy();
                     26: 
                     27: lispval
                     28: Lflatsi()
                     29: {
                     30:        register lispval current;
                     31:        Savestack(1);                   /* fixup entry mask */
                     32: 
                     33:        fmax = 0x7fffffff;      /* biggest integer by default */
                     34:        switch(np-lbot) 
                     35:        {
                     36:            case 2: current = lbot[1].val;
                     37:                    while(TYPE(current) != INT)
                     38:                        current = errorh1(Vermisc,
                     39:                                        "flatsize: second arg not integer",
                     40:                                        nil,TRUE,0,current);
                     41:                    fmax = current->i;
                     42:            case 1: break;
                     43:            default: argerr("flatsize");
                     44:        }
                     45: 
                     46:        flen = 0; 
                     47:        current = lbot->val;
                     48:        protect(nil);                   /*create space for argument to pntlen*/
                     49:        Iflatsi(current);
                     50:        Restorestack();
                     51:        return(inewint(flen));
                     52: }
                     53: /*
                     54:  * Iflatsi does the real work of the calculation for flatc
                     55:  */
                     56: Iflatsi(current)
                     57: register lispval current;
                     58: {
                     59: 
                     60:        if(flen > fmax) return;
                     61:        switch(TYPE(current)) {
                     62: 
                     63:        patom:
                     64:        case INT: case ATOM: case DOUB: case STRNG:
                     65:                np[-1].val = current;
                     66:                flen += Ipntlen();
                     67:                return;
                     68:        
                     69:        pthing:
                     70:        case DTPR:
                     71:                flen++;
                     72:                Iflatsi(current->d.car);
                     73:                current = current->d.cdr;
                     74:                if(current == nil) {
                     75:                        flen++;
                     76:                        return;
                     77:                }
                     78:                if(flen > fmax) return;
                     79:                switch(TYPE(current)) {
                     80:                case INT: case ATOM: case DOUB:
                     81:                        flen += 4;
                     82:                        goto patom;
                     83:                case DTPR:
                     84:                        goto pthing;
                     85:                }
                     86:        }
                     87: }
                     88: 
                     89: 
                     90: #define EADC -1
                     91: #define EAD  -2
                     92: lispval
                     93: Lread()
                     94: { return (r(EAD)); }
                     95: 
                     96: lispval
                     97: Lratom()
                     98: { return (r(ATOM)); }
                     99: 
                    100: lispval
                    101: Lreadc()
                    102: { return (r(EADC)); }
                    103: 
                    104: 
                    105: extern unsigned char *ctable;
                    106: /* r *********************************************************************/
                    107: /* this function maps the desired read         function into the system-defined */
                    108: /* reading functions after testing for a legal port.                    */
                    109: lispval
                    110: r(op)
                    111: int op;
                    112: {
                    113:        unsigned char c; register lispval result;
                    114:        register cc;
                    115:        int orlevel; extern int rlevel;
                    116:        FILE *ttemp;
                    117:        struct nament *oldbnp = bnp;
                    118:        Savestack(2);
                    119: 
                    120:        switch(np-lbot) {
                    121:        case 0:
                    122:                protect(nil);
                    123:        case 1:
                    124:                protect(nil);
                    125:        case 2: break;
                    126:        default:
                    127:                argerr("read or ratom or readc");
                    128:        }
                    129:        result = Vreadtable->a.clb;
                    130:        chkrtab(result);
                    131:        orlevel = rlevel;
                    132:        rlevel = 0;
                    133:        ttemp = okport(Vpiport->a.clb,stdin);
                    134:        ttemp = okport(lbot->val,ttemp);
                    135: /*printf("entering switch\n");*/
                    136:        if(ttemp == stdin) fflush(stdout);      /* flush any pending 
                    137:                                                 * characters if reading stdin 
                    138:                                                 * there should be tests to see
                    139:                                                 * if this is a tty or pipe
                    140:                                                 */
                    141: 
                    142:        switch (op)
                    143:        {
                    144:        case EADC:      rlevel = orlevel;
                    145:                        cc = getc(ttemp);
                    146:                        c = cc;
                    147:                        if(cc == EOF)
                    148:                        {
                    149:                                Restorestack();
                    150:                                return(lbot[1].val);
                    151:                        } else {
                    152:                                strbuf[0] = hash = (c & 0177);
                    153:                                strbuf[1] = 0;
                    154:                                atmlen = 2;
                    155:                                Restorestack();
                    156:                                return((lispval)getatom(TRUE));
                    157:                        }
                    158: 
                    159:        case ATOM:      rlevel = orlevel;
                    160:                        result = (ratomr(ttemp));
                    161:                        goto out;
                    162: 
                    163:        case EAD:       PUSHDOWN(Vpiport,P(ttemp)); /* rebind Vpiport */
                    164:                        result = readr(ttemp);
                    165:        out:            if(result==eofa)
                    166:                        {    
                    167:                             if(sigintcnt > 0) sigcall(SIGINT);
                    168:                             result = lbot[1].val;
                    169:                        }
                    170:                        rlevel = orlevel;
                    171:                        popnames(oldbnp);       /* unwind bindings */
                    172:                        Restorestack();
                    173:                        return(result);
                    174:        }
                    175:        /* NOTREACHED */
                    176: }
                    177: 
                    178: /* Lload *****************************************************************/
                    179: /* Reads in and executes forms from the specified file. This should      */
                    180: /* really be an nlambda taking multiple arguments, but the error        */
                    181: /* handling gets funny in that case (one file out of several not        */
                    182: /* openable, for instance).                                             */
                    183: lispval
                    184: Lload()
                    185: {
                    186:        register FILE *port;
                    187:        register char *p, *ttemp; register lispval vtemp;
                    188:        struct nament *oldbnp = bnp;
                    189:        int orlevel,typ;
                    190:        char longname[100];
                    191:        char *shortname, *end2, *Ilibdir();
                    192:        /*Savestack(4); not necessary because np not altered */
                    193: 
                    194:        chkarg(1,"load");
                    195:        if((typ = TYPE(lbot->val)) == ATOM)
                    196:            ttemp =  lbot->val->a.pname ;  /* ttemp will point to name */
                    197:        else if(typ == STRNG)
                    198:            ttemp = (char *) lbot->val;
                    199:        else 
                    200:             return(error("FILENAME MUST BE ATOMIC",FALSE));
                    201:        strcpy(longname, Ilibdir());
                    202:        for(p = longname; *p; p++);
                    203:        *p++ = '/'; *p = 0;
                    204:        shortname = p;
                    205:        strcpy(p,ttemp);
                    206:        for(; *p; p++);
                    207:                end2 = p;
                    208:        strcpy(p,".l");
                    209:        if ((port = fopen(shortname,"r")) == NULL &&
                    210:                (port = fopen(longname, "r")) == NULL) {
                    211:                        *end2 = 0;
                    212:                        if ((port = fopen(shortname,"r")) == NULL &&
                    213:                                (port = fopen(longname, "r")) == NULL)
                    214:                                        errorh1(Vermisc,"Can't open file: ", 
                    215:                                                     nil,FALSE,0,lbot->val);
                    216:        }
                    217:        orlevel = rlevel;
                    218:        rlevel = 0;
                    219: 
                    220:        if(ISNIL(copval(gcload,CNIL)) &&
                    221:                loading->a.clb != tatom &&
                    222:                ISNIL(copval(gcdis,CNIL)))
                    223:                gc((struct types *)CNIL);    /*  do a gc if gc will be off  */
                    224: 
                    225:        /* shallow bind the value of lisp atom piport   */
                    226:        /* so readmacros will work                      */
                    227:        PUSHDOWN(Vpiport,P(port));
                    228:        PUSHDOWN(loading,tatom);        /* set indication of loading status */
                    229: 
                    230:        while ((vtemp = readr(port)) != eofa) {
                    231:            eval(vtemp);
                    232:        }
                    233:        popnames(oldbnp);               /* unbind piport, loading */
                    234: 
                    235:        rlevel = orlevel;
                    236:        fclose(port);
                    237:        return(nil);
                    238: }
                    239: 
                    240: /* concat **************************************************
                    241: -
                    242: -  use: (concat arg1 arg2 ... )
                    243: -
                    244: -  concatenates the print names of all of its arguments.
                    245: - the arguments may be atoms, integers or real numbers.
                    246: -
                    247: - *********************************************************/
                    248: lispval
                    249: Iconcat(unintern)
                    250: {
                    251:        register struct argent *temnp;
                    252:        register char *cp = strbuf;
                    253:        register lispval cur;
                    254:        int n;
                    255:        char *sprintf(), *atomtoolong();
                    256:        lispval Lhau();
                    257: 
                    258:        *cp = NULL_CHAR ;
                    259: 
                    260:        /* loop for each argument */
                    261:        for(temnp = lbot + AD ; temnp < np ; temnp++)
                    262:        {
                    263:            cur = temnp->val;
                    264:            switch(TYPE(cur))
                    265:            {
                    266:            case ATOM:
                    267:                 n = strlen(cur->a.pname);
                    268:                 while(n + cp >= endstrb) cp = atomtoolong(cp);
                    269:                 strcpy(cp, cur->a.pname);
                    270:                 cp += n;
                    271:                 break;
                    272: 
                    273:            case STRNG:
                    274:                 n = strlen( (char *) cur);
                    275:                 while(n + cp >= endstrb) cp = atomtoolong(cp);
                    276:                 strcpy(cp, (char *) cur);
                    277:                 cp += n;
                    278:                 break;
                    279: 
                    280:            case INT:
                    281:                 if(15 + cp >= endstrb) cp = atomtoolong(cp);
                    282:                 sprintf(cp,"%d",cur->i);
                    283:                 while(*cp) cp++;
                    284:                 break;
                    285: 
                    286:            case DOUB:
                    287:                 if(15 + cp >= endstrb) cp = atomtoolong(cp);
                    288:                 sprintf(cp,"%f",cur->f);
                    289:                 while(*cp) cp++;
                    290:                 break;
                    291: 
                    292:            case SDOT: {
                    293:                struct _iobuf _myiob;
                    294:                register lispval handy = cur;
                    295: 
                    296:                for(n = 12; handy->s.CDR!=(lispval) 0; handy = handy->s.CDR)
                    297:                        n += 12;
                    298: 
                    299:                while(n + cp >= endstrb) cp = atomtoolong(cp);
                    300: 
                    301:                _myiob._flag = _IOWRT+_IOSTRG;
                    302:                _myiob._ptr = cp;
                    303:                _myiob._cnt = endstrb - cp - 1;
                    304: 
                    305:                pbignum(cur,&_myiob);
                    306:                cp = _myiob._ptr;
                    307:                *cp = 0;
                    308:                break; }
                    309:                    
                    310:            default:
                    311:                 cur = error("Non atom or number to concat",TRUE);
                    312:                 continue;    /* if returns value, try it */
                    313:           }
                    314: 
                    315:        }
                    316: 
                    317:        if(unintern)
                    318:                return( (lispval) newatom(FALSE)); /* uninterned atoms may
                    319:                                                        have printname gc'd*/
                    320:        else
                    321:                return( (lispval) getatom(FALSE)) ;
                    322: }
                    323: lispval
                    324: Lconcat(){
                    325:        return(Iconcat(FALSE));
                    326: }
                    327: lispval
                    328: Luconcat(){
                    329:        return(Iconcat(TRUE));
                    330: }
                    331: 
                    332: lispval
                    333: Lputprop()
                    334: {
                    335:        lispval Iputprop();
                    336:        chkarg(3,"putprop");
                    337:        return(Iputprop(lbot->val,lbot[1].val,lbot[2].val));
                    338: }
                    339: 
                    340: /*
                    341:  * Iputprop :internal version of putprop used by some C functions
                    342:  *  note: prop and ind are lisp values but are not protected (by this
                    343:  * function) from gc.  The caller should protect them!!
                    344:  */
                    345: lispval
                    346: Iputprop(atm,prop,ind)
                    347: register lispval prop, ind, atm;
                    348: {
                    349:        register lispval pptr;
                    350:        lispval *tack;          /* place to begin property list */
                    351:        lispval pptr2;
                    352:        lispval errorh();
                    353:        Savestack(4);
                    354:        
                    355:  top:
                    356:        switch (TYPE(atm)) {
                    357:        case ATOM:
                    358:                if(atm == nil) tack = &nilplist;
                    359:                else tack =  &(atm->a.plist);
                    360:                break;
                    361:        case DTPR:
                    362:                for (pptr = atm->d.cdr ; pptr != nil ; pptr = pptr->d.cdr->d.cdr)
                    363:                    if(TYPE(pptr) != DTPR || TYPE(pptr->d.cdr) != DTPR) break;
                    364:                if(pptr != nil) 
                    365:                {   atm = errorh1(Vermisc,
                    366:                                 "putprop: bad disembodied property list",
                    367:                                 nil,TRUE,0,atm);
                    368:                    goto top;
                    369:                }
                    370:                tack = (lispval *) &(atm->d.cdr);
                    371:                break;
                    372:        default:
                    373:                errorh1(Vermisc,"putprop: Bad first argument: ",nil,FALSE,0,atm);
                    374:        }
                    375:        pptr = *tack;   /* start of property list */
                    376: /*findit:*/
                    377:        for (pptr = *tack ; pptr != nil ; pptr = pptr->d.cdr->d.cdr)
                    378:                if (pptr->d.car == ind) {
                    379:                        (pptr->d.cdr)->d.car = prop;
                    380:                        Restorestack();
                    381:                        return(prop);
                    382:                }
                    383:        /* not found, add to front
                    384:           be careful, a gc could occur before the second newdot() */
                    385:           
                    386:        pptr = newdot();
                    387:        pptr->d.car = prop;
                    388:        pptr->d.cdr = *tack;
                    389:        protect(pptr);
                    390:        pptr2 = newdot();
                    391:        pptr2->d.car = ind;
                    392:        pptr2->d.cdr = pptr;
                    393:        *tack = pptr2;
                    394:        Restorestack();
                    395:        return(prop);
                    396: }
                    397: 
                    398: /* get from property list 
                    399:  *   there are three routines to accomplish this
                    400:  *     Lget - lisp callable, the first arg can be a symbol or a disembodied
                    401:  *           property list.  In the latter case we check to make sure it
                    402:  *           is a real one (as best we can).
                    403:  *     Iget - internal routine, the first arg must be a symbol, no disembodied
                    404:  *           plists allowed
                    405:  *     Igetplist - internal routine, the first arg is the plist to search.
                    406:  */
                    407: lispval
                    408: Lget()
                    409: {
                    410:        register lispval ind, atm;
                    411:        register lispval dum1;
                    412:        lispval Igetplist();
                    413: 
                    414:        chkarg(2,"get");
                    415:        ind = lbot[1].val;
                    416:        atm = lbot[0].val;
                    417: top:
                    418:        switch(TYPE(atm)) {
                    419:        case ATOM:
                    420:                if(atm==nil) atm = nilplist;
                    421:                else atm = atm->a.plist;
                    422:                break;          
                    423: 
                    424:        case DTPR:
                    425:                for (dum1 = atm->d.cdr; dum1 != nil; dum1 = dum1->d.cdr->d.cdr)
                    426:                    if((TYPE(dum1) != DTPR) || 
                    427:                       (TYPE(dum1->d.cdr) != DTPR)) break; /* bad prop list */
                    428:                if(dum1 != nil) 
                    429:                {   atm = errorh1(Vermisc,
                    430:                                 "get: bad disembodied property list",
                    431:                                 nil,TRUE,0,atm);
                    432:                    goto top;
                    433:                }
                    434:                atm = atm->d.cdr;
                    435:                break;
                    436:        default:
                    437:                /* remove since maclisp doesnt treat
                    438:                   this as an error, ugh
                    439:                   return(errorh1(Vermisc,"get: bad first argument: ",
                    440:                               nil,FALSE,0,atm));
                    441:                 */
                    442:                 return(nil);
                    443:        }
                    444: 
                    445:        while (atm != nil)
                    446:                {
                    447:                        if (atm->d.car == ind)
                    448:                                return ((atm->d.cdr)->d.car);
                    449:                        atm = (atm->d.cdr)->d.cdr;
                    450:                }
                    451:        return(nil);
                    452: }
                    453: /*
                    454:  * Iget - the first arg must be a symbol.
                    455:  */
                    456:        
                    457: lispval
                    458: Iget(atm,ind)
                    459: register lispval atm, ind;
                    460: {
                    461:        lispval Igetplist();
                    462: 
                    463:        if(atm==nil)
                    464:                atm = nilplist;
                    465:        else
                    466:                atm = atm->a.plist;
                    467:        return(Igetplist(atm,ind));
                    468: }
                    469: 
                    470: /*
                    471:  *  Igetplist
                    472:  * pptr is a plist
                    473:  * ind is the indicator
                    474:  */
                    475: 
                    476: lispval
                    477: Igetplist(pptr,ind)
                    478: register lispval pptr,ind;
                    479: {
                    480:        while (pptr != nil)
                    481:                {
                    482:                        if (pptr->d.car == ind)
                    483:                                return ((pptr->d.cdr)->d.car);
                    484:                        pptr = (pptr->d.cdr)->d.cdr;
                    485:                }
                    486:        return(nil);
                    487: }
                    488: lispval
                    489: Lgetd()
                    490: {
                    491:        register lispval typ;
                    492:        
                    493:        chkarg(1,"getd");
                    494:        typ = lbot->val;
                    495:        if (TYPE(typ) != ATOM) 
                    496:           errorh1(Vermisc,
                    497:                  "getd: Only symbols have function definitions",
                    498:                  nil,
                    499:                  FALSE,
                    500:                  0,
                    501:                  typ);
                    502:        return(typ->a.fnbnd);
                    503: }
                    504: lispval
                    505: Lputd()
                    506: {
                    507:        register lispval atom, list;
                    508:        
                    509:        chkarg(2,"putd");
                    510:        list = lbot[1].val;
                    511:        atom = lbot->val;
                    512:        if (TYPE(atom) != ATOM) error("only symbols have function definitions",
                    513:                                        FALSE);
                    514:        atom->a.fnbnd = list;
                    515:        return(list);
                    516: }
                    517: 
                    518: /* ===========================================================
                    519: - mapping functions which return a list of the answers
                    520: - mapcar applies the given function to successive elements
                    521: - maplist applies the given function to successive sublists
                    522: - ===========================================================*/
                    523: 
                    524: lispval
                    525: Lmapcrx(maptyp,join)
                    526: int maptyp;            /* 0 = mapcar,  1 = maplist  */
                    527: int join;              /* 0 = the above, 1 = s/car/can/ */
                    528: {
                    529:        register struct argent *namptr;
                    530:        register index;
                    531:        register lispval temp;
                    532:        register lispval current;
                    533: 
                    534:        struct argent *first, *last;
                    535:        int count;
                    536:        lispval lists[25], result;
                    537:        Savestack(4);
                    538:        
                    539:        namptr = lbot + 1;
                    540:        count = np - namptr;
                    541:        if (count <= 0) return (nil);
                    542:        result = current =  (lispval) np;
                    543:        protect(nil);                   /* set up space for returned list */
                    544:        protect(lbot->val);     /*copy funarg for call to funcall */
                    545:        lbot = np -1;
                    546:        first = np;
                    547:        last = np += count;
                    548:        for(index = 0; index < count; index++) {
                    549:                temp =(namptr++)->val; 
                    550:                if (TYPE (temp ) != DTPR && temp!=nil) 
                    551:                        error ( "bad list argument to map",FALSE);
                    552:                lists[index] = temp;
                    553:        }
                    554:        for(;;) {
                    555:                for(namptr=first,index=0; index<count; index++) {
                    556:                        temp = lists[index];
                    557:                        if(temp==nil) goto done;
                    558: 
                    559:                        if(maptyp==0) (namptr++)->val = temp->d.car;
                    560:                        else (namptr++)->val = temp;
                    561: 
                    562:                        lists[index] = temp->d.cdr;
                    563:                }
                    564:                if (join == 0) {
                    565:                        current->l = newdot();
                    566:                        current->l->d.car = Lfuncal();
                    567:                        current = (lispval) &current->l->d.cdr;
                    568:                } else {
                    569:                        current->l = Lfuncal();
                    570:                        if ( TYPE ( current -> l) != DTPR && current->l != nil)
                    571:                                error("bad type returned from funcall inside map",FALSE);
                    572:                        else  while ( current -> l  != nil )
                    573:                                        current = (lispval) & (current ->l ->d.cdr);
                    574:                }
                    575:                np = last;
                    576:        }
                    577: done:  if (join == 0)current->l = nil;
                    578:        Restorestack();
                    579:        return(result->l);
                    580: }
                    581: 
                    582: /* ============================
                    583: -
                    584: - Lmapcar
                    585: - =============================*/
                    586: 
                    587: lispval
                    588: Lmpcar()
                    589: {
                    590:        return(Lmapcrx(0,0));   /* call general routine */
                    591: }
                    592: 
                    593: 
                    594: /* ============================
                    595: -
                    596: -
                    597: -  Lmaplist
                    598: - ==============================*/
                    599: 
                    600: lispval
                    601: Lmaplist()
                    602: {
                    603:        return(Lmapcrx(1,0));   /* call general routine */
                    604: }
                    605: 
                    606: 
                    607: /* ================================================
                    608: - mapping functions which return the value of the last function application.
                    609: - mapc and map
                    610: - ===================================================*/
                    611: 
                    612: lispval
                    613: Lmapcx(maptyp)
                    614: int maptyp;            /* 0= mapc   , 1= map  */
                    615: {
                    616:        register struct argent *namptr;
                    617:        register index;
                    618:        register lispval temp;
                    619:        register lispval result;
                    620: 
                    621:        int count;
                    622:        struct argent *first;
                    623:        lispval lists[25], errorh();
                    624:        Savestack(4);
                    625:        
                    626:        namptr = lbot + 1;
                    627:        count = np - namptr;
                    628:        if(count <= 0) return(nil);
                    629:        result = lbot[1].val;           /*This is what macsyma wants so ... */
                    630:                                        /*copy funarg for call to funcall */
                    631:        lbot = np; protect((namptr - 1)->val);
                    632:        first = np; np += count;
                    633: 
                    634:        for(index = 0; index < count; index++) {
                    635:                temp = (namptr++)->val;
                    636:                while(temp!=nil && TYPE(temp)!=DTPR)
                    637:                        temp = errorh1(Vermisc,"Inappropriate list argument to mapc",nil,TRUE,0,temp);
                    638:                lists[index] = temp;
                    639:        }
                    640:        for(;;) {
                    641:                for(namptr=first,index=0; index<count; index++) {
                    642:                        temp = lists[index];
                    643:                        if(temp==nil)
                    644:                                goto done;
                    645:                        if(maptyp==0)
                    646:                                (namptr++)->val = temp->d.car;
                    647:                        else
                    648:                                (namptr++)->val = temp;
                    649:                        lists[index] = temp->d.cdr;
                    650:                }
                    651:                Lfuncal();
                    652:        }
                    653: done:  
                    654:        Restorestack();
                    655:        return(result);
                    656: }
                    657: 
                    658: 
                    659: /* ==================================
                    660: -
                    661: -      mapc   map the car of the lists
                    662: -
                    663: - ==================================*/
                    664: 
                    665: lispval
                    666: Lmapc()
                    667: {      return( Lmapcx(0) );  }
                    668: 
                    669: 
                    670: /* =================================
                    671: -
                    672: -      map    map the cdr of the lists
                    673: -
                    674: - ===================================*/
                    675: 
                    676: lispval
                    677: Lmap()
                    678: {      return( Lmapcx(1) );   }
                    679: 
                    680: 
                    681: lispval
                    682: Lmapcan()
                    683: { 
                    684:        lispval Lmapcrx();
                    685: 
                    686:        return ( Lmapcrx ( 0,1 ) ); 
                    687: } 
                    688: 
                    689: lispval
                    690: Lmapcon()
                    691: { 
                    692:        lispval Lmapcrx();
                    693: 
                    694:        return ( Lmapcrx ( 1,1 ) ); 
                    695: }

unix.superglobalmegacorp.com

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