* Ndo maclisp do function.
register lispval current
, where
, handy
;
register struct nament
*mybnp
;
register struct argent
*lbot
, *np
;
lispval body
, endtest
, endform
, varstuf
, renewals
[NDOVARS
] ;
struct argent
*start
, *last
, *getem
, *savedlbot
;
struct nament
*savedbnp
, *lastbnd
;
int count
, index
, saveme
[SAVSIZE
], virgin
= 1;
int myerrp
; extern int errp
;
getexit(saveme
); /* common nonlocal return */
return((lispval
) contval
);
switch( TYPE(varstuf
) ) {
case ATOM
: /* This is old style maclisp do;
atom is var, cadr(current) = init;
caddr(current) = repeat etc. */
if(varstuf
==nil
) goto newstyle
;
bnp
->atm
= atom
; /* save current binding of atom */
atom
->clb
= eval(current
->car
);
*renewals
= (current
= current
->cdr
)->car
;
endtest
= (current
= current
->cdr
)->car
;
atom
->clb
= eval(*renewals
);
case DTPR
: /* New style maclisp do; atom is
list of things of the form
for(where
= varstuf
; where
!= nil
; where
= where
->cdr
) {
/* do inits and count do vars. */
/* requires "simultaneous" eval
error("More than 15 do vars",FALSE
);
for(index
= 0; index
< count
; index
++) {
/* get var name from group */
/* Swap current binding of atom
for init val pushed on stack */
atom
->clb
= getem
++->val
;
/* As long as we are down here in the
list, save repeat form */
handy
= CNIL
; /* be sure not to rebind later */
/* more loop "increments" */
/* Examine End test and End form */
/* The following is the loop: */
for(handy
= nil
; endform
!=nil
; endform
= endform
->cdr
){
handy
= eval(endform
->car
);
/* Simultaneously eval repeat forms */
for(index
= 0; index
< count
; index
++) {
if (temp
== nil
|| temp
== CNIL
)
/* now simult. rebind all the atoms */
for(index
= 0; index
< count
; index
++, getem
++) {
if( (getem
)->val
!= CNIL
) /* if this atom has a repeat form */
mybnp
->atm
->clb
= (getem
)->val
; /* rebind */
register lispval where
, temp
;
/*register struct nament *savednp = np, *savedlbot = lbot;*/
extern int errp
; int myerrp
= errp
;
struct nament
*savedbnp
= bnp
;
default: resexit(saveme
);
where
->car
!= (lispval
) contval
; where
= where
->cdr
) {
/* np is automatically restored here by
virtue of being a register */
while (TYPE(where
) == DTPR
) {
if((TYPE(temp
))!=ATOM
) eval(temp
);
register lispval argptr
, where
, handy
, atoms
;
register struct argent
*lbot
, *np
;
struct argent
*namptr
, *start
;
struct nament
*oldbnp
= bnp
;
protect(eval(where
->car
)); /* list of vars */
protect(eval((where
= where
->cdr
)->car
));
for(;handy
!=nil
; handy
= handy
->cdr
) {
(np
++)->val
= eval(handy
->car
);
for(where
= where
->cdr
; where
!= nil
; where
= where
->cdr
)
handy
= eval(where
->car
);
register lispval result
, where
;
for(where
= lbot
->val
; where
!= nil
; where
= where
->cdr
)
result
= eval(where
->car
);
register lispval result
, where
;
result
= eval((where
= where
->cdr
)->car
);
for(where
= where
->cdr
; where
!= nil
; where
= where
->cdr
)