perm filename RUNFN1.MLI[MLI,LSP] blob sn#112529 filedate 1975-06-29 generic text, type T, neo UTF8
BEGIN


SPECIAL ?&X?&, ?&Y?&;


EXPR ?&FOR (L, FN, EX, B);
	BEGIN
	NEW ?&Y?&, NOTFIRST, LST;
	LST ← MAPCAR(FUNCTION(LAMBDA (?&X?&);
		<CADR ?&X?&, CADDR ?&X?& EQ 'ON, CADDR ?&X?& EQ '?←,
			CAR ?&X?& EQ 'NEW, 
			IF GET(CADR ?&X?&, 'VALUE) THEN CDR GET(CADR ?&X?&, 'VALUE)
			ELSE CDR GET('?&UNBOUND?&, 'VALUE)> CONS EVAL CADDDR ?&X?&),
		L);
LOOP; 	IF ?&FORSTOP(LST) THEN ?&FORRESET(LST, T) ALSO RETURN ?&Y?&;
	MAPCAR(FUNCTION(LAMBDA (?&X?&);
		SET(CAAR ?&X?&, IF CADAR ?&X?& THEN CDR ?&X?& ELSE CADR ?&X?&)),
		LST);
	?&Y?& ← EVAL IF NOTFIRST THEN <FN, '?&Y?&, EX> ELSE NOTFIRST ← T ALSO EX;
	IF EVAL B THEN ?&FORRESET(LST, NIL) ALSO RETURN ?&Y?&;
	LST ← MAPCAR(FUNCTION(LAMBDA (?&X?&);
		CAR ?&X?& CONS (IF CADDAR ?&X?& THEN EVAL CDDR ?&X?& ELSE CDDR ?&X?&)),
		LST);
	GO LOOP;
	END;


EXPR ?&FORSTOP (L);
	L AND (NULL CDAR(L) OR ?&FORSTOP(CDR L));


EXPR ?&FORRESET (L, ?&Y?&);
	MAPCAR(FUNCTION(LAMBDA (?&X?&);
		IF CADDDR CAR ?&X?& THEN SET(CAAR ?&X?&, CADDDR CDAR ?&X?&)
		ELSE ?&Y?& AND NULL CDR ?&X?& AND SET(CAAR ?&X?&, NIL)), L);


EXPR ?&RANGE (LOW, UP, INC);
	IF INC = 0 THEN NIL
	ELSE ?&RANGE1(LOW, UP, INC, INC GREATERP 0, INC LESSP 0);


EXPR ?&RANGE1 (LOW, UP, INC, POS, NEG);
	IF (POS AND LOW GREATERP UP) OR (NEG AND LOW LESSP UP) THEN NIL
	ELSE <LOW, '?&RANGE1, LOW + INC, UP, INC, POS, NEG>;


EXPR ?&DO (FN, EX, B);
	BEGIN
	NEW V;
L; 	V ← FN(V, EVAL EX);
	IF EVAL B THEN RETURN V
	ELSE GO L;
	END;


EXPR ?&WHILE (FN, B, EX);
	BEGIN
	NEW V;
L; 	IF EVAL B THEN V ← FN(V, EVAL EX)
	ELSE RETURN V;
	GO L;
	END;


EXPR ?&INDEX (L, X);
	IF X THEN ?&INDEX(CAR (L ↓ SUB1 CAR X), CDR X)
	ELSE L;


END.