'BEGIN' 'COMMENT' THE SERPINSKI (SP?) CURVE. A SIMPLE DEMO... ; 'INTEGER' N, H0; N := 2; 'COMMENT' RECURSION DEEP ; H0 := 32; 'COMMENT' 'WINDOW' WIDTH / HEIGHT (POWER OF 2) ; 'BEGIN' 'INTEGER' I, H, X, Y, X0, Y0; 'INTEGER' PENY, PENX; 'BOOLEAN' 'ARRAY' SCR [0 : H0, 0 : H0]; 'PROCEDURE' SERP; 'BEGIN' I := 0; H := H0 / 4; X0 := 2 * H; Y0 := 3 * H; DOLOOP: I := I + 1; X0 := X0 - H; H := H / 2; Y0 := Y0 + H; X := X0; Y := Y0; SETPEN; A (I); X := X + H; Y := Y - H; MOVEPEN; B (I); X := X - H; Y := Y - H; MOVEPEN; C (I); X := X - H; Y := Y + H; MOVEPEN; D (I); X := X + H; Y := Y + H; MOVEPEN; 'IF' I < N 'THEN' 'GOTO' DOLOOP 'END'; 'PROCEDURE' A (I); 'VALUE' I; 'INTEGER' I; 'BEGIN' 'IF' I > 0 'THEN' 'BEGIN' A (I-1); X := X + H; Y := Y - H; MOVEPEN; B (I-1); X := X + 2 * H; MOVEPEN; D (I-1); X := X + H; Y := Y + H; MOVEPEN; A (I-1) 'END' 'END'; 'PROCEDURE' B (I); 'VALUE' I; 'INTEGER' I; 'BEGIN' 'IF' I > 0 'THEN' 'BEGIN' B (I-1); X := X - H; Y := Y - H; MOVEPEN; C (I-1); Y := Y - 2 * H; MOVEPEN; A (I-1); X := X + H; Y := Y - H; MOVEPEN; B (I-1) 'END' 'END'; 'PROCEDURE' C (I); 'VALUE' I; 'INTEGER' I; 'BEGIN' 'IF' I > 0 'THEN' 'BEGIN' C (I-1); X := X - H; Y := Y + H; MOVEPEN; D (I-1); X := X - 2 * H; MOVEPEN; B (I-1); X := X - H; Y := Y - H; MOVEPEN; C (I-1) 'END' 'END'; 'PROCEDURE' D (I); 'VALUE' I; 'INTEGER' I; 'BEGIN' 'IF' I > 0 'THEN' 'BEGIN' D (I-1); X := X + H; Y := Y + H; MOVEPEN; A (I-1); Y := Y + 2 * H; MOVEPEN; C (I-1); X := X - H; Y := Y + H; MOVEPEN; D (I-1) 'END' 'END'; 'PROCEDURE' SETPEN; 'BEGIN' PENX := X; PENY := Y 'END'; 'PROCEDURE' XLINE (Y, X, DX); 'VALUE' Y, X, DX; 'INTEGER' Y, X, DX; 'BEGIN' 'INTEGER' I; 'FOR' I := 0 'STEP' 1 'UNTIL' DX 'DO' SCR [Y, X + I] := 'TRUE' 'END'; 'PROCEDURE' YLINE (X, Y, NY); 'VALUE' X, Y, NY; 'INTEGER' X, Y, NY; 'BEGIN' 'INTEGER' J; 'FOR' J := 0 'STEP' 1 'UNTIL' NY 'DO' SCR [Y + J, X] := 'TRUE' 'END'; 'PROCEDURE' DRLINE (Y1, X1, Y2, X2); 'VALUE' Y1, X1, Y2, X2; 'INTEGER' Y1, X1, Y2, X2; 'BEGIN' 'INTEGER' I, J, DX, DY; 'REAL' SY, SX, Y, X; DY := Y2 - Y1; DX := X2 - X1; 'IF' ABS (DY) > ABS (DX) 'THEN' 'BEGIN' SY := SIGN (DY); SX := SIGN (DX) * ABS (DX / DY) 'END' 'ELSE' 'BEGIN' SY := SIGN (DY) * ABS (DY / DX); SX := SIGN (DX) 'END'; Y := Y1; X := X1; DOLOOP: SCR [Y, X] := 'TRUE'; Y := Y + SY; X := X + SX; 'IF' (Y1 <= Y2 'AND' Y <= Y2) 'OR' (Y1 >= Y2 'AND' Y >= Y2) 'OR' (X1 <= X2 'AND' X <= X2) 'OR' (X1 >= X2 'AND' X >= X2) 'THEN' 'GOTO' DOLOOP 'END'; 'PROCEDURE' MOVEPEN; 'BEGIN' 'INTEGER' 'PROCEDURE' MIN (X, Y); 'VALUE' X, Y; 'INTEGER' X, Y; 'IF' X < Y 'THEN' MIN := X 'ELSE' MIN := Y; 'IF' PENX = X 'THEN' YLINE (X, MIN (Y, PENY), ABS (Y - PENY)) 'ELSE' 'IF' PENY = Y 'THEN' XLINE (Y, MIN (X, PENX), ABS (X - PENX)) 'ELSE' DRLINE (PENY, PENX, Y, X); PENX := X; PENY := Y 'END'; 'COMMENT' THIS IS THE MAIN PROGRAM: ; 'BEGIN' 'INTEGER' I, J; 'COMMENT' CLEANUP THE SCREEN ; 'FOR' J := 0 'STEP' 1 'UNTIL' H0 'DO' 'FOR' I := 0 'STEP' 1 'UNTIL' H0 'DO' SCR [J, I] := 'FALSE'; SERP; 'COMMENT' PRINT THE SCREEN ; 'FOR' J := 0 'STEP' 1 'UNTIL' H0 'DO' 'BEGIN' 'FOR' I := 0 'STEP' 1 'UNTIL' H0 'DO' 'IF' SCR [J, I] 'THEN' WRITE ("##") 'ELSE' WRITE (" "); OUTSYMBOL (1, "\N", 0) 'END' 'END' 'END' 'END'