tmacbool.pp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. program macbool;
  2. {$mode macpas}
  3. { checks boolean evaluation in macpas mode }
  4. var
  5. ftruecalled, ffalsecalled: boolean;
  6. function ftrue: boolean;
  7. begin
  8. ftruecalled := true;
  9. ftrue := true;
  10. end;
  11. function ffalse: boolean;
  12. begin
  13. ffalsecalled := true;
  14. ffalse := false;
  15. end;
  16. begin
  17. { OR and |, short circuit }
  18. {$b-}
  19. ffalsecalled := false;
  20. ftruecalled := false;
  21. if (ftrue or ffalse) then
  22. begin
  23. if not(ftruecalled) then
  24. halt(1);
  25. if ffalsecalled then
  26. halt(2);
  27. end
  28. else
  29. halt(128);
  30. ffalsecalled := false;
  31. ftruecalled := false;
  32. if not(ffalse or ftrue) then
  33. halt(3);
  34. if not(ffalsecalled) then
  35. halt(4);
  36. if not(ftruecalled) then
  37. halt(5);
  38. ffalsecalled := false;
  39. ftruecalled := false;
  40. if (ftrue | ffalse) then
  41. begin
  42. if not(ftruecalled) then
  43. halt(6);
  44. if ffalsecalled then
  45. halt(7);
  46. end
  47. else
  48. halt(129);
  49. ffalsecalled := false;
  50. ftruecalled := false;
  51. if not(ffalse | ftrue) then
  52. halt(8);
  53. if not(ffalsecalled) then
  54. halt(9);
  55. if not(ftruecalled) then
  56. halt(10);
  57. { OR and |, full evaluation }
  58. {$b+}
  59. ffalsecalled := false;
  60. ftruecalled := false;
  61. if (ftrue or ffalse) then
  62. begin
  63. if not(ftruecalled) then
  64. halt(11);
  65. if not(ffalsecalled) then
  66. halt(12);
  67. end
  68. else
  69. halt(130);
  70. ffalsecalled := false;
  71. ftruecalled := false;
  72. if not(ffalse or ftrue) then
  73. halt(13);
  74. if not(ffalsecalled) then
  75. halt(14);
  76. if not(ftruecalled) then
  77. halt(15);
  78. ffalsecalled := false;
  79. ftruecalled := false;
  80. if (ftrue | ffalse) then
  81. begin
  82. if not(ftruecalled) then
  83. halt(16);
  84. if ffalsecalled then
  85. halt(17);
  86. end
  87. else
  88. halt(131);
  89. ffalsecalled := false;
  90. ftruecalled := false;
  91. if not(ffalse | ftrue) then
  92. halt(18);
  93. if not(ffalsecalled) then
  94. halt(19);
  95. if not(ftruecalled) then
  96. halt(20);
  97. { AND and &, short circuit }
  98. {$b-}
  99. ffalsecalled := false;
  100. ftruecalled := false;
  101. if (ftrue and ffalse) then
  102. halt(21);
  103. if not(ftruecalled) then
  104. halt(211);
  105. if not(ffalsecalled) then
  106. halt(22);
  107. ffalsecalled := false;
  108. ftruecalled := false;
  109. if (ffalse and ftrue) then
  110. halt(23);
  111. if not(ffalsecalled) then
  112. halt(24);
  113. if (ftruecalled) then
  114. halt(25);
  115. ffalsecalled := false;
  116. ftruecalled := false;
  117. if (ftrue & ffalse) then
  118. halt(206);
  119. if not(ftruecalled) then
  120. halt(26);
  121. if not(ffalsecalled) then
  122. halt(27);
  123. ffalsecalled := false;
  124. ftruecalled := false;
  125. if (ffalse & ftrue) then
  126. halt(28);
  127. if not(ffalsecalled) then
  128. halt(29);
  129. if (ftruecalled) then
  130. halt(30);
  131. { AND and &, full evaluation }
  132. {$b+}
  133. ffalsecalled := false;
  134. ftruecalled := false;
  135. if (ftrue and ffalse) then
  136. halt(31);
  137. if not(ftruecalled) then
  138. halt(111);
  139. if not(ffalsecalled) then
  140. halt(32);
  141. ffalsecalled := false;
  142. ftruecalled := false;
  143. if (ffalse and ftrue) then
  144. halt(33);
  145. if not(ffalsecalled) then
  146. halt(34);
  147. if not(ftruecalled) then
  148. halt(35);
  149. ffalsecalled := false;
  150. ftruecalled := false;
  151. if (ftrue & ffalse) then
  152. halt(133);
  153. if not(ftruecalled) then
  154. halt(36);
  155. if not(ffalsecalled) then
  156. halt(37);
  157. ffalsecalled := false;
  158. ftruecalled := false;
  159. if (ffalse & ftrue) then
  160. halt(38);
  161. if not(ffalsecalled) then
  162. halt(39);
  163. if (ftruecalled) then
  164. halt(40);
  165. end.