matpri2.red 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. MODULE MATPRI; % matrix prettyprinter
  2. % Author: Takeyuki Takahashi, Toyohashi University of Technology.
  3. GLOBAL '(!&COUNT!& !&M!-P!-FLAG!& !&NAME !&NAMEARRAY);
  4. % General functions.
  5. SYMBOLIC PROCEDURE TERPRI!* U;
  6. BEGIN INTEGER N;
  7. IF !&M!-P!-FLAG!& THEN <<!&COUNT!& := T; GO TO C>>;
  8. IF !*FORT THEN RETURN FTERPRI U
  9. ELSE IF NOT PLINE!* OR NOT !*NAT THEN GO TO B;
  10. N := YMAX!*;
  11. PLINE!* := REVERSE PLINE!*;
  12. A:
  13. SCPRINT(PLINE!*,N);
  14. TERPRI();
  15. IF N=YMIN!* THEN GO TO B;
  16. N := N - 1;
  17. GO TO A;
  18. B:
  19. IF U THEN TERPRI();
  20. C:
  21. PLINE!* := NIL;
  22. POSN!* := ORIG!*;
  23. YCOORD!* := YMAX!* := YMIN!* := 0
  24. END;
  25. SYMBOLIC PROCEDURE PLUS!-L U; PLUS!-L1(0,U);
  26. SYMBOLIC PROCEDURE PLUS!-L1(N,U);
  27. IF NULL U THEN N ELSE <<N := N + CAR U; PLUS!-L1(N,CDR U)>>;
  28. SYMBOLIC PROCEDURE DELNTH(N,L);
  29. IF N=1 THEN CDR L ELSE CAR L . DELNTH(N - 1,CDR L);
  30. % MATRIX Pretty printer.
  31. SYMBOLIC PROCEDURE MAT!-P!-PRINT U;
  32. BEGIN INTEGER C!-LENG1,ICOLN,PP,ICOL,COLUMN!-LENG,M,N;
  33. SCALAR COLUMN!-S!-POINT,MAXLENG,ELEMENT!-LENG;
  34. U := CDR U;
  35. ICOLN := LENGTH CAR U;
  36. ICOL := LINELENGTH NIL - 8;
  37. !&M!-P!-FLAG!& := T;
  38. ELEMENT!-LENG := !&COUNT U;
  39. !&M!-P!-FLAG!& := NIL;
  40. A:
  41. MAXLENG := !&MAX!-ROW ELEMENT!-LENG;
  42. C!-LENG1 := PLUS!-L MAXLENG + 3*(ICOLN - 1);
  43. IF C!-LENG1=COLUMN!-LENG THEN GO TO DUMP;
  44. COLUMN!-LENG := C!-LENG1;
  45. IF COLUMN!-LENG>ICOL
  46. THEN <<ELEMENT!-LENG :=
  47. SUBST( - 1,MAXL MAXLENG,ELEMENT!-LENG);
  48. GO TO A>>;
  49. PRIN2!* !&NAME;
  50. PRIN2!* " := ";
  51. TERPRI!* NIL;
  52. N := 0;
  53. COLUMN!-S!-POINT :=
  54. FOR EACH Y IN MAXLENG COLLECT <<N := N + Y;
  55. N := N + 3;
  56. N + 3>>;
  57. COLUMN!-S!-POINT := APPEND(LIST 3,COLUMN!-S!-POINT);
  58. TERPRI();
  59. PRIN2 "|-";
  60. SPACES (COLUMN!-LENG + 4);
  61. PRIN2 "-|";
  62. TERPRI();
  63. M := 1;
  64. FOR EACH Y IN U DO
  65. <<N := 1;
  66. FOR EACH Z IN Y DO
  67. <<POSN!* := NTH(COLUMN!-S!-POINT,N);
  68. IF NTH(NTH(ELEMENT!-LENG,M),N)<0
  69. THEN <<PRIN2!* "*";
  70. PRIN2!* "(";
  71. PRIN2!* M;
  72. PRIN2!* ",";
  73. PRIN2!* N;
  74. PRIN2!* ")">>
  75. ELSE MAPRIN Z;
  76. N := N + 1>>;
  77. PP := COLUMN!-LENG + 7;
  78. FOR I := YMIN!*:YMAX!* DO
  79. <<PLINE!* := APPEND(PLINE!*, LIST(((0 . 1) . I) . "|"));
  80. PLINE!* := APPEND(LIST(((PP . (PP + 1)) . I) . "|"),
  81. PLINE!*)>>;
  82. TERPRI!* NIL;
  83. M := M + 1;
  84. PRIN2 "| ";
  85. SPACES (COLUMN!-LENG + 4);
  86. PRIN2 " |";
  87. TERPRI()>>;
  88. PRIN2 "|-";
  89. SPACES (COLUMN!-LENG + 4);
  90. PRIN2 "-|";
  91. TERPRI();
  92. TERPRI();
  93. M := 1;
  94. FOR EACH Y IN U DO
  95. <<N := 1;
  96. FOR EACH Z IN Y DO
  97. <<IF NTH(NTH(ELEMENT!-LENG,M),N)<0
  98. THEN <<PRIN2!* "*";
  99. PRIN2!* "(";
  100. PRIN2!* M;
  101. PRIN2!* ",";
  102. PRIN2!* N;
  103. PRIN2!* ")";
  104. PRIN2!* " ";
  105. MAPRIN Z;
  106. TERPRI!* T>>;
  107. N := N + 1>>;
  108. M := M + 1>>;
  109. RETURN NIL;
  110. DUMP:
  111. PRIN2T "Column length too long";
  112. MATPRI!*('MAT . U,LIST MKQUOTE !&NAME,'ONLY)
  113. END;
  114. SYMBOLIC PROCEDURE !&COUNT U;
  115. BEGIN INTEGER N;
  116. RETURN FOREACH Y IN U COLLECT
  117. FOREACH Z IN Y COLLECT
  118. <<!&COUNT!& := NIL;
  119. MAPRIN Z;
  120. N := POSN!*;
  121. PLINE!* := NIL;
  122. POSN!* := ORIG!*;
  123. YCOORD!* := YMAX!* := YMIN!* := 0;
  124. IF NULL !&COUNT!& THEN N ELSE MINUS N>>;
  125. END;
  126. GLOBAL '(!&MAX!-L);
  127. SYMBOLIC PROCEDURE !&MAX!-ROW U;
  128. BEGIN SCALAR V;
  129. A:
  130. IF NULL CAR U THEN RETURN V;
  131. U := !&MAX!-ROW1 U;
  132. V := APPEND(V,LIST !&MAX!-L);
  133. GO TO A
  134. END;
  135. SYMBOLIC PROCEDURE !&MAX!-ROW1 U;
  136. BEGIN
  137. !&MAX!-L := 1;
  138. RETURN FOR EACH Y IN U COLLECT
  139. <<!&MAX!-L := IF CAR Y<0 THEN 6
  140. ELSE MAX(!&MAX!-L,CAR Y);
  141. CDR Y>>
  142. END;
  143. SYMBOLIC PROCEDURE MAXL U; MAXL1(CDR U,CAR U);
  144. SYMBOLIC PROCEDURE MAXL1(U,V);
  145. IF NULL U THEN V
  146. ELSE IF CAR U>V THEN MAXL1(CDR U,CAR U)
  147. ELSE MAXL1(CDR U,V);
  148. SYMBOLIC PROCEDURE MPRINT U;
  149. BEGIN SCALAR V;
  150. A:
  151. IF NULL U THEN RETURN NIL
  152. ELSE IF ATOM CAR U AND (V := GET(CAR U,'MATRIX))
  153. THEN <<!&NAME := CAR U;
  154. MAT!-P!-PRINT V;
  155. !&NAME := NIL>>
  156. ELSE IF STRINGP CAR U THEN VARPRI(CAR U,NIL,'ONLY)
  157. ELSE IF V := ARRAYP CAR U
  158. THEN <<!&NAMEARRAY := CAR U;
  159. PRINT!-ARRAY2(LIST V,NIL);
  160. !&NAMEARRAY := NIL;
  161. NIL>>
  162. ELSE <<!&NAME := CAR U;
  163. RAT!-P!-PRINT AEVAL CAR U;
  164. !&NAME := NIL>>;
  165. B:
  166. U := CDR U;
  167. GO TO A
  168. END;
  169. RLISTAT '(MPRINT);
  170. SYMBOLIC PROCEDURE PRINT!-ARRAY2(U,W);
  171. BEGIN INTEGER N; SCALAR V;
  172. V := CAR U;
  173. IF CAR V EQ '!&VECTOR
  174. THEN BEGIN
  175. N := CADR V;
  176. V := CDR V;
  177. IF W THEN W := CAR W;
  178. FOR I := 0:N DO
  179. <<V := CDR V;
  180. PRINT!-ARRAY2(V,LIST APPEND(W,LIST I))>>
  181. END
  182. ELSE IF V NEQ 0
  183. THEN <<!&NAME := APPEND(LIST !&NAMEARRAY,CAR W);
  184. RAT!-P!-PRINT V;
  185. !&NAME := NIL>>
  186. END;
  187. % Rational function Pretty printer.
  188. SYMBOLIC PROCEDURE RAT!-P!-PRINT U;
  189. BEGIN INTEGER OS,LN,ORGNUM,ORGDEN,LL,LENNUM,LENDEN;
  190. SCALAR NAME,UDEN,UNUM;
  191. IF NULL U THEN RETURN NIL;
  192. IF NUMBERP U
  193. THEN <<VARPRI(U,LIST MKQUOTE !&NAME,'ONLY);
  194. TERPRI();
  195. !&NAME := NIL;
  196. RETURN NIL>>;
  197. U := CADR U;
  198. !&M!-P!-FLAG!& := T;
  199. LENDEN := !&COUNT!-LENGTH (UDEN := CDR U./1);
  200. LENNUM := !&COUNT!-LENGTH (UNUM := CAR U./1);
  201. !&M!-P!-FLAG!& := NIL;
  202. LN := (LINELENGTH NIL - LENGTHC !&NAME) - 4;
  203. OS := ORIG!*;
  204. IF CDR U=1 OR LENDEN>LN OR LENNUM>LN THEN GO TO DUMP;
  205. IF !&NAME
  206. THEN <<INPRINT('SETQ,2,LIST !&NAME);
  207. OPRIN 'SETQ;
  208. NAME := PLINE!*;
  209. OS := POSN!*;
  210. !&NAME := NIL;
  211. PLINE!* := NIL>>;
  212. IF LENDEN>LENNUM
  213. THEN <<ORGNUM := (LENDEN - LENNUM)/2; LL := LENDEN>>
  214. ELSE <<ORGDEN := (LENNUM - LENDEN)/2; LL := LENNUM>>;
  215. POSN!* := ORGNUM + OS + 1;
  216. MAPRIN MK!*SQ UNUM;
  217. TERPRI!* NIL;
  218. IF NAME THEN PLINE!* := NAME ELSE PLINE!* := NIL;
  219. POSN!* := OS;
  220. FOR I := 1:LL + 2 DO PRIN2!* "-";
  221. TERPRI!* NIL;
  222. POSN!* := ORGDEN + OS + 1;
  223. MAPRIN MK!*SQ UDEN;
  224. TERPRI!* T;
  225. RETURN NIL;
  226. DUMP:
  227. VARPRI(MK!*SQ U,LIST MKQUOTE !&NAME,'ONLY);
  228. TERPRI();
  229. !&NAME := NIL
  230. END;
  231. SYMBOLIC PROCEDURE !&COUNT!-LENGTH U;
  232. BEGIN INTEGER N;
  233. !&COUNT!& := NIL;
  234. MAPRIN MK!*SQ U;
  235. N := POSN!* - ORIG!*;
  236. IF !&COUNT!& THEN N := LINELENGTH NIL + 10;
  237. PLINE!* := NIL;
  238. POSN!* := ORIG!*;
  239. YCOORD!* := YMAX!* := YMIN!* := 0;
  240. RETURN N
  241. END;
  242. ENDMODULE;
  243. END;