perm filename RUNFN2.MLI[MLI,LSP] blob sn#151575 filedate 1975-06-03 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	BEGIN
C00012 ENDMK
C⊗;
BEGIN


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


EXPR PRELIST (L, N);
	FOR NEW ?&X?& ← 1 TO N FOR NEW I IN L COLLECT <I>;


EXPR SUFLIST (L, N);
	IF N LESSP 1 THEN L
	ELSE WHILE L AND NOT((N ← N-1) LESSP 0) DO L ← CDR L;


EXPR STR (X);
	PROG2(	IF X ← EXPLODEC X THEN RPLACD(LAST X, '(?")) ELSE X ← '(?"),
		READLIST('?" CONS X));


EXPR STRP (X);
	ATOM X AND NOT NUMBERP X AND ?&STRP(GET(X, 'PNAME), LAST GET(X, 'PNAME));


% EXPR STRP (X);	-- VERSION THAT DOES NOT USE THE LAP FUNCTION &STRP	%
%	ATOM X AND NOT NUMBERP X AND (X ← EXPLODE X)				%
%		AND CAR X EQ '?" AND CAR LAST(X) EQ '?";			%


EXPR STRLEN (X);
	LENGTH EXPLODEC X;


EXPR SEQ (X, Y);
	EXPLODEC X = EXPLODEC Y;


EXPR AT (X);
	IF NOT ATOM X THEN AT STR(X)
	ELSE IF NUMBERP X THEN READLIST('?/ CONS EXPLODE X)
	ELSE IF NOT STRP(X) THEN X
	ELSE	BEGIN  NEW S,D,G;
		G ← GENSYM();
		S ← GET(X, 'PNAME);
		PUTPROP(G,
			D ← MAPCAR(FUNCTION(LAMBDA (X);
				CAR GET(GENSYM(), 'PNAME)), S),
			'PNAME);
		RETURN(IF ?©(S, D) THEN '?&NONAME ELSE INTERN G);
		END;


% EXPR AT (X);		-- VERSION THAT DOES NOT USE THE LAP FUNCTION ©	%
%	READLIST(FOR NEW I IN EXPLODEC X COLLECT <'?/, I>);			%


EXPR CAT (X, Y);
	READLIST('?" CONS EXPLODEC X @ EXPLODEC Y @ <'?">);


EXPR SUBSTR (S, STRT, LEN);
	READLIST('?"
		CONS (	IF NUMBERP LEN THEN (EXPLODEC S)↓(STRT-1) ↑ LEN
			ELSE (EXPLODEC S)↓(STRT-1))
		@ <'?">);


EXPR PRINTSTR (X);
	TERPRI PRINC X;


EXPR PRINTTY (X);
	BEGIN  NEW FILE;
	FILE ← OUTC(NIL, NIL);
	PRINC X;
	PRINC " ";
	OUTC(FILE, NIL);
	RETURN X;
	END;


EXPR NEQ (X, Y);
	NOT(X EQ Y);


EXPR NEQUAL (X, Y);
	NOT(X EQUAL Y);


EXPR LEQUAL (X, Y);
	NOT(X GREATERP Y);


EXPR GEQUAL (X, Y);
	NOT(X LESSP Y);


EXPR ?&VECTOR (PREFIX, FN, X, Y);
	IF PREFIX THEN 
		IF X AND ATOM X THEN
			IF GET(FN, 'MACRO) THEN EVAL <FN, <'QUOTE, X>> ELSE FN(X)
		ELSE MAPCAR(FN, X)
	ELSE 	BEGIN
		NEW V, L, ATOMX, ATOMY, CARX, CARY, M;
		ATOMX ← X AND ATOM X;
		ATOMY ← Y AND ATOM Y;
		M     ← GET(FN, 'MACRO);
		IF ATOMX AND ATOMY THEN
			RETURN	IF M THEN EVAL <FN, <'QUOTE, X>, <'QUOTE, Y>>
				ELSE FN(X, Y);
		V ← L ← <NIL>;
	LOOP; 	IF NULL X OR NULL Y THEN RETURN CDR V;
		IF ATOMX THEN CARX ← X ELSE CARX ← CAR X ALSO X ← CDR X;
		IF ATOMY THEN CARY ← Y ELSE CARY ← CAR Y ALSO Y ← CDR Y;
		L ← CDR RPLACD(L,
		       <IF M THEN EVAL <FN, <'QUOTE, CARX>, <'QUOTE, CARY>>
			ELSE FN(CARX, CARY)>);
		GO LOOP;
		END;


EXPR ?&REPLACE (L, X, V);
	IF X THEN ?&REP1(L, X, V, CAR X, 1)
	ELSE V;


EXPR ?&REP1 (L, X, V, Y, N);
	IF ATOM L THEN 
		IF Y = N THEN ?&REPLACE(NIL, CDR X, V) CONS NIL
		ELSE NIL CONS ?&REP1(NIL, X, V, Y, ADD1 N)
	ELSE IF Y = N THEN ?&REPLACE(CAR L, CDR X, V) CONS CDR L
	ELSE CAR L CONS ?&REP1(CDR L, X, V, Y, ADD1 N);


EXPR ?&DECOMPOSE (TEM, L);
	PROG2(?&DEC1(TEM, L, NIL), L);


EXPR ?&DEC1 (TEM, L, U);
	IF NULL TEM THEN
		NULL L
	ELSE IF ATOM TEM THEN
		TEM EQ '_ OR SET(TEM, L) OR T
	ELSE IF ATOM L THEN
		(NULL L AND TEM = '(_)) OR ?&SETNIL(TEM)
	ELSE IF CAR TEM EQ '_ THEN
		?&DEC1(CDR TEM, L, T) OR ?&DEC1(TEM, CDR L, U)
	ELSE IF U THEN
		?&DEC1(CAR TEM, CAR L, T) AND ?&DEC1(CDR TEM, CDR L, T)
	ELSE U ← ?&DEC1(CAR TEM, CAR L, NIL)
		ALSO ?&DEC1(CDR TEM, CDR L, NIL) AND U;


EXPR ?&SETNIL (TEM);
	IF NULL TEM OR TEM EQ '_ THEN NIL
	ELSE IF ATOM TEM THEN SET(TEM, NIL)
	ELSE ?&SETNIL(CAR TEM) ALSO ?&SETNIL(CDR TEM);


INLINE	(LAP ?© SUBR)	% COPY(PNAME(SOURCE), PNAME(DESTINATION)) %
	(PUSH P 6)		% FREE UP ACC 6 FOR A COUNT %
	(MOVEI 6 4)		% CHARS_LEFT ← 4 %
	(PUSH P (C 0))		% PREVIOUS LINK %
	(MOVE 3 ISPTR_)		% INITIALIZE SOURCE BYTE POINTER %
	(MOVEM 3 SPTR_)
	(MOVE 3 IDPTR_)		% INITIALIZE DESTINATION BYTE POINTER %
	(MOVEM 3 DPTR_)
	(HLRZ?@ 4 1)		% 4 ← CAR(1) %
	(HLRZ?@ 5 2)		% 5 ← CAR(2) %
	(133000 0 SPTR_)	% IBP -- SKIP OVER THE FIRST " %
LOOP_	(134000 3 SPTR_)	% ILDB -- GET A CHARACTER %
	(CAIN 3 42)		% " ? %
	(JRST 0 FINISH_)	% YES %
	(136000 3 DPTR_)	% IDPB -- NO, DEPOSIT IT IN DESTINATION %
	(367000 6 LOOP_)	% SOJG -- CHARS_LEFT ← CHARS_LEFT-1 %
	(MOVEI 6 4)		% CHARS_LEFT ← 4 %
	(MOVEM 2 0 P)		% PREVIOUS LINK %
	(MOVE 3 ISPTR_)		% REINITIALIZE SOURCE BYTE POINTER %
	(MOVEM 3 SPTR_)
	(HRRZ?@ 1 1)		% 1 ← CDR(1) %
	(HLRZ?@ 4 1)		% 4 ← CAR(1) %
	(134000 3 SPTR_)	% ILDB -- GET FIRST CHARACTER IN NEXT WORD %
	(CAIN 3 42)		% " ? %
	(JRST 0 LASTCH_)	% YES %
	(136000 3 DPTR_)	% IDPB -- NO, DEPOSIT IT IN DESTINATION %
	(MOVE 3 IDPTR_)		% REINITIALIZE DESTINATION BYTE POINTER %
	(MOVEM 3 DPTR_)
	(HRRZ?@ 2 2)		% 2 ← CDR(2) %
	(HLRZ?@ 5 2)		% 5 ← CAR(2) %
	(JRST 0 LOOP_)
LASTCH_	(MOVEI 1 0)		% STICK 0 IN LAST CHARACTER OF DESTINATION %
	(136000 1 DPTR_)	% IDPB %
FINISH_	(MOVEI 1 0)		% RETURN NIL %
	(CAIN 6 4)
	(JRST 0 NULLCDR_)
LOOP1_	(136000 1 DPTR_)	% IDPB -- PAD OUT DESTINATION WITH 0'S %
	(365000 6 LOOP1_)	% SOJGE %
EXIT_	(POP P 2)
	(POP P 6)
	(POPJ P)
NULLCDR_(336000 0 0 P)			% SKIPN %
	(334000 1 (C 0 0 (QUOTE T) 0))	% SKIPA -- RETURN T IF NO CHARACTERS IN PNAME ("") %
	(HRRM?@ 1 0 P)			% RPLACD -- SHORTEN PNAME LIST BY ONE %
	(JRST 0 EXIT_)
ISPTR_	(440700 0 0 4)
IDPTR_	(440700 0 0 5)
SPTR_	(0)
DPTR_	(0)
	NIL;


INLINE	(LAP ?&STRP SUBR)	%		1	2	3	4	5		%
	(HLRZ?@ 3 1)		% CAR		WD1	WDL	ADDR1				%
	(MOVE 4 PTR_)		%		WD1	WDL	ADDR1	BP:44			%
	(134000 5 4)		% ILDB		WD1	WDL	ADDR1	BP:35	CHR1		%
	(CAIE 5 42)
	(JRST 0 FALSE_)		%		WD1	WDL	ADDR1	BP:35	CHR1≠"		%
	(MOVEI 5 5)		%		WD1	WDL	ADDR1	BP:35	COUNT=5		%
	(CAMN 1 2)
	(364000 5 LOOP_)	% SOJA		WD1  =	WDL	ADDR1	BP:35	COUNT=4		%
	(HLRZ?@ 3 2)		% CAR		WD1  ≠	WDL	ADDRL	BP:35	COUNT=5		%
	(MOVE 4 PTR_)		%		WD1	WDL	ADDRL	BP:44	COUNT=5		%
LOOP_	(134000 1 4)		% ILDB		CHR	WDL	ADDRL	BP	COUNT		%
	(JUMPE 1 FALSE_)	%		CHR=0	WDL	ADDRL	BP	COUNT		%
	(CAIN 1 42)
	(JRST 0 TRUE_)		%		CHR="	WDL	ADDRL	BP	COUNT		%
	(367000 5 LOOP_)	% SOJG		CHR	WDL	ADDRL	BP	COUNT-1		%
FALSE_	(TDZA 1 1)
TRUE_	(MOVEI 1 (QUOTE T))
	(POPJ P)
PTR_	(440700 0 0 3)
	NIL;


END.