deep.pas 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. program Deep;
  2. { Deep Blair Pascal surface test: must be accepted by the blaise oracle
  3. AND by the Blaise validator pilot. }
  4. const
  5. MaxItems = 100;
  6. Neg = -5;
  7. Pi = 3.14159;
  8. Bits = 1 or 2 xor 4;
  9. Sh = 1 shl 3 + 16 shr 2;
  10. Mask = Bits and $FF;
  11. Greeting = 'Hello, ' + 'world';
  12. Names: array[0..1] of String = ('Sunny', 'Cloudy');
  13. M: array[0..1, 0..2] of Integer = ((1, 2, 3), (4, 5, 6));
  14. type
  15. TColor = (Red, Green, Blue);
  16. TSub = Red..Blue;
  17. TByte = 0..255;
  18. TNeg = -10..10;
  19. TArr = array[0..9] of Integer;
  20. TMatrix = array[0..1, 0..2] of Integer;
  21. TByColor = array[TColor] of Integer;
  22. TByBool = array[Boolean] of Integer;
  23. TDyn = array of Integer;
  24. TSet = set of TColor;
  25. TByteSet = set of Byte;
  26. TRangeSet = set of 0..255;
  27. PInt = ^Integer;
  28. PPInt = ^PInt;
  29. TPoint = record
  30. X, Y: Integer;
  31. function Sum: Integer;
  32. end;
  33. TPacked = packed record
  34. B: Byte;
  35. I: Integer;
  36. end;
  37. TLogger = class(TObject)
  38. private
  39. FName: String;
  40. [Weak] FParent: TLogger;
  41. public
  42. constructor Create(AName: String); overload;
  43. destructor Destroy; override;
  44. procedure Log(Msg: String);
  45. function Level: Integer;
  46. function GetItem(Index: Integer): Integer;
  47. procedure SetItem(Index: Integer; Value: Integer);
  48. static var Count: Integer;
  49. property Name: String read FName write FName;
  50. property Items[Index: Integer]: Integer read GetItem write SetItem; default;
  51. end;
  52. TBox = class
  53. public
  54. function Get<T>(X: T): Integer;
  55. end;
  56. IShape = interface
  57. function Area: Integer;
  58. function GetSize: Integer;
  59. property Size: Integer read GetSize;
  60. end;
  61. EApp = class
  62. end;
  63. INamed = interface(IShape)
  64. function Title: String;
  65. end;
  66. TProc = reference to procedure(Value: Integer);
  67. TFunc = reference to function(A, B: Integer): Integer;
  68. TSingle = reference to function(N: Integer): Integer;
  69. TMyMeth = procedure of object;
  70. TGetInt = function: Integer;
  71. const
  72. Primary = [Red, Green];
  73. var
  74. i, j: Integer;
  75. b: Boolean;
  76. r: Integer;
  77. s: TSet;
  78. a: TArr;
  79. mat: TMatrix;
  80. p: PInt;
  81. logger: TLogger;
  82. box: TBox;
  83. shape: IShape;
  84. callback: TFunc;
  85. oneparam: TSingle;
  86. counter: Integer = 0;
  87. threadvar
  88. TLS: Integer;
  89. function TPoint.Sum: Integer;
  90. begin
  91. Result := X + Y
  92. end;
  93. constructor TLogger.Create(AName: String);
  94. begin
  95. inherited Create();
  96. FName := AName
  97. end;
  98. destructor TLogger.Destroy;
  99. begin
  100. inherited Destroy()
  101. end;
  102. procedure TLogger.Log(Msg: String);
  103. var
  104. Local: Integer;
  105. begin
  106. WriteLn(Msg);
  107. Local := Local + 1
  108. end;
  109. function TLogger.Level: Integer;
  110. begin
  111. Result := TLogger.Count
  112. end;
  113. function TLogger.GetItem(Index: Integer): Integer;
  114. begin
  115. Result := Index
  116. end;
  117. procedure TLogger.SetItem(Index: Integer; Value: Integer);
  118. begin
  119. end;
  120. function Add(const A, B: Integer): Integer; overload;
  121. begin
  122. Result := A + B
  123. end;
  124. function Add(const A: String; const B: String): String; overload;
  125. begin
  126. Result := A + B
  127. end;
  128. procedure Fill(var A: TArr; Value: Integer = 0);
  129. var
  130. k: Integer;
  131. begin
  132. for k := 0 to 9 do
  133. A[k] := Value
  134. end;
  135. procedure Consume(out X: Integer);
  136. begin
  137. X := 42
  138. end;
  139. function Find(Needle: Integer; const Hay: TArr): Integer;
  140. var
  141. k: Integer;
  142. begin
  143. Result := -1;
  144. for k := 0 to 9 do
  145. if Hay[k] = Needle then
  146. begin
  147. Result := k;
  148. Break
  149. end;
  150. if Result = -1 then
  151. raise
  152. end;
  153. begin
  154. i := $FF + &77 + %101 + 1_000;
  155. r := 0;
  156. b := (i = 1) and (j <> 2) or not (i < j);
  157. b := (i = 1) xor True;
  158. i := 1 shl 2 + 8 shr 1;
  159. b := Blue in s;
  160. s := [Red, Green];
  161. s := [];
  162. a[0] := 1;
  163. mat[0, 1] := 2;
  164. logger := TLogger.Create('x');
  165. logger.Log('hi');
  166. i := logger.Level();
  167. i := TLogger.Count;
  168. logger.FName := 'y';
  169. p := nil;
  170. i := Low(a);
  171. i := High(a);
  172. callback := (A, B) -> A + B;
  173. i := callback(1, 2);
  174. oneparam := N -> N * 2;
  175. case i of
  176. 1: Write(1);
  177. 2, 3: Write(2);
  178. 4..6: Write(3)
  179. else
  180. Write(9)
  181. end;
  182. while i < 10 do
  183. i := i + 1;
  184. repeat
  185. i := i - 1
  186. until i <= 0;
  187. for i in a do
  188. j := i;
  189. try
  190. i := 1
  191. finally
  192. i := 2
  193. end;
  194. try
  195. i := 1
  196. except
  197. on E: EApp do
  198. i := 2
  199. else
  200. i := 3
  201. end;
  202. if b then
  203. i := 1
  204. else if b then
  205. i := 2
  206. else
  207. i := 3;
  208. Fill(a);
  209. Fill(a, 7);
  210. Consume(i);
  211. i := Add(1, 2);
  212. WriteLn('done')
  213. end.