hodza/BlackBox.Shkola.2014 huggingface dataset:
i21Greeting.odc


Проект ИНФОРМАТИКА-21

Внедрение современных технологий и методов программирования 
в общие базовые курсы программирования 
(5-11 классы средних школ и 1-3 курсы университетов, 
независимо от профиля и специализации)
с целью создания единого пространства 
для преподавания основ ИТ 
как естественного продолжения 
единой общей системы преподавания основ математики

Подробная информация о проекте: http://www.inr.ac.ru/~info21/

Для вопросов и замечаний: info21@inr.ac.ru

Благодарности. Российские версии среды обучения и разработки программ, носящие название Блэкбокс, основаны на системе программирования BlackBox Component Builder, созданной в Oberon microsystems, Inc., в развитие идей, впервые реализованных в Системе Оберон Никлауса Вирта и Юрга Гуткнехта (Niklaus Wirth, Jurg Gutknecht, ETH, Zurich, Switzerland). Со-архитектор Блэкбокса Клеменс Шиперски (Clemens Szyperski) работает в исследовательском подразделении корпорации Майкрософт (Microsoft Research).

Вклад в создание данного пакета внесли множество людей, в том числе: Wolfgang Weck, И.Н.Горячев, И.А.Дехтяренко, И.Е.Ермаков, А.С.Ильин, ketmar, Ю.Л.Костюк, Л.Г.Куркина, Т.В.Овсянникова, А.И.Попков, Б.В.Рюмшин, Е.Э.Темиргалеев, Ф.В.Ткачев, И.А.Цвелая.
Особая благодарность  компании Метасистемы (г.Орел), а также всем тем, кто принял участие в переводах документации на русский язык.

г Все тексты программ и др. материалы проекта, если не указано иное: проект Информатика-21 ( http://www.inr.ac.ru/~info21/), 2002-2012 гг. Никакое коммерческое использование материалов, в том числе в рамках PR-деятельности коммерческих фирм и т.п., без письменного разрешения авторов не допускается.
readme, профи!.odc


Это вход для профи, много лет проведших с традиционными средствами разработки, чтобы облегчить им традиционную ломку. 

	Профи

Выше жирно напечатано имя простого модуля, в котором содержится програмка типа Hello World и объяснения.
Чтобы открыть и поиграть с исходником, дважды кликнуть по Профи (хоть по этому, хоть по тому) и нажать Ctrl+0 (тут нуль  цифра).

Исходник хранится в документе Mod/Профи.odc и это не чистый текст  не надо пытаться открывать его в Блокноте  при работе в Блэкбоксе необходим только Блэкбокс со своим интегрированным редактором. 
Так нужно, потому что в Оберонах вообще и в Блэкбоксе в частности реализована идея текст как интерфейс, т.е. вместо традиционной командной строки, где редактируется только последняя строчка, здесь весь (любой) текстовый документ может служить этакой двумерной командной строкой для ввода команд и данных. 
Понадобится время, чтобы уяснить себе всё удобство и всю мощь этого обобщения.

Можно точно так же быстро (двойной клик, Ctrl+0) открыть исходники других модулей, например, i21sysEdit (файл i21sys/Mod/Edit.odc; о правилах хранения модулей см. инструкции на сайте Информатика-21 и Полезныесведения
 программеры удивлялись, что достаточно инструкций на сайте и в документации, чтобы довольно быстро начать продуктивно работать: толстых учебников не нужно).

В модуле i21sysEdit зашито, как именно кнопка F5 раскрывает синтаксические конструкции по первому слову, причем с правильными отступами (табы). См. ссылки в объяснениях к исходнику.

Успехов!
info21
2009-03-28; последне испр. 2010-04-01
PS Большая благодарность В.В.Лаптеву за совет.
ADru/Docu/ru/S171_Files.odc

ADruS171_Files

DEFINITION ADruS171_Files;

	TYPE
		File = POINTER TO RECORD  END;

		Rider = EXTENSIBLE RECORD 
			eof-: BOOLEAN
		END;

	PROCEDURE Close (VAR f: File);
	PROCEDURE New (name: ARRAY OF CHAR): File;
	PROCEDURE Old (name: ARRAY OF CHAR): File;
	PROCEDURE Read (VAR r: Rider; OUT ch: CHAR);
	PROCEDURE ReadInt (VAR r: Rider; OUT x: INTEGER);
	PROCEDURE Set (VAR r: Rider; f: File; pos: INTEGER);
	PROCEDURE Write (VAR r: Rider; ch: CHAR);
	PROCEDURE WriteInt (VAR r: Rider; x: INTEGER);

END ADruS171_Files.

Эмуляция модуля Files из книжки Н.Вирта "Алгоритмы и структуры данных. Новая версия для Оберона", ДМК Пресс, 2010, переводчик Ф.В.Ткачев
ADru/Docu/ru/S174_Texts.odc

ADruS174_Texts

DEFINITION ADruS174_Texts;

	CONST
		Char = 4;
		Int = 1;
		Name = 3;
		Real = 2;

	TYPE
		Reader = RECORD 
			eot-: BOOLEAN
		END;

		Scanner = RECORD 
			class-, i-: INTEGER;
			x-: REAL;
			s-: ARRAY 32 OF CHAR;
			ch-, nextCh-: CHAR
		END;

		Text = RECORD  END;

		Writer = RECORD  END;

	VAR
		log: Text;

	PROCEDURE Close (VAR w: Writer);
	PROCEDURE Length (t: Text): INTEGER;
	PROCEDURE OpenReader (VAR r: Reader; t: Text; pos: INTEGER);
	PROCEDURE OpenScanner (VAR s: Scanner; t: Text; pos: INTEGER);
	PROCEDURE OpenWriter (VAR w: Writer; t: Text; pos: INTEGER);
	PROCEDURE Read (VAR r: Reader; VAR ch: CHAR);
	PROCEDURE Scan (VAR s: Scanner);
	PROCEDURE Write (VAR w: Writer; ch: CHAR);
	PROCEDURE WriteInt (VAR w: Writer; x, n: INTEGER);
	PROCEDURE WriteLn (VAR w: Writer);
	PROCEDURE WriteReal (VAR w: Writer; x: REAL);
	PROCEDURE WriteString (VAR w: Writer; s: ARRAY OF CHAR);

END ADruS174_Texts.

Эмуляция модуля Files из книжки Н.Вирта "Алгоритмы и структуры данных. Новая версия для Оберона", ДМК Пресс, 2010, переводчик Ф.В.Ткачев


Для удобства использования в Блэкбоксе добавлены:

VAR log: Text; 
запись в этот текст приводит к записи в Рабочий журнал (Log).

PROCEDURE Length( t: Text ): INTEGER;
Смысл функции очевиден.
С ее помощью можно писать в конец Рабочего журнала, например:
	ADruTexts.OpenWriter( w, ADruTexts.log, ADruTexts.Length( ADruTexts.log ) );
ADru/Docu/ru/S242_Runs.odc

ADruS242_Runs

DEFINITION ADruS242_Runs;

	IMPORT ADruS174_Texts, ADruS171_Files;

	TYPE
		Rider = RECORD (ADruS171_Files.Rider)
			(* ADruS171_Files.Rider *) eof-: BOOLEAN;
			first-: INTEGER;
			eor-: BOOLEAN
		END;

	PROCEDURE ListSeq (VAR W: ADruS174_Texts.Writer; f: ADruS171_Files.File);
	PROCEDURE LogSeq (f: ADruS171_Files.File);
	PROCEDURE OpenRandomSeq (f: ADruS171_Files.File; length, seed: INTEGER);
	PROCEDURE Set (VAR r: Rider; f: ADruS171_Files.File);
	PROCEDURE copy (VAR src, dest: Rider);

END ADruS242_Runs.

Эмуляция модуля Runs из книжки Н.Вирта "Алгоритмы и структуры данных. Новая версия для Оберона", ДМК Пресс, 2010, переводчик Ф.В.Ткачев
ADru/Docu/ru/S33_Draw.odc

ADruS33_Draw

DEFINITION ADruS33_Draw;

	CONST
		height = 512;
		width = 512;

	PROCEDURE Clear;
	PROCEDURE NextThick;
	PROCEDURE SetPen (x, y: INTEGER);
	PROCEDURE Test;
	PROCEDURE line (dir, len: INTEGER);

END ADruS33_Draw.

Эмуляция модуля Draw из книжки Н.Вирта "Алгоритмы и структуры данных. Новая версия для Оберона", ДМК Пресс, 2010, переводчик Ф.В.Ткачев
ADru/Mod/S14.odc

(*  Общие сведения о примерах: Справка *)
(*  Исправления и подготовка примеров: (С) Ф.В.Ткачев, 2009, info21 AT inr.ac.ru *)

MODULE  ADruS14;  (* Примеры из раздела 1.4. *)

	IMPORT  Log := StdLog,  In := i21sysIn,  Texts := ADruS174_Texts;
	
	PROCEDURE For*;
		CONST  N = 100;
		VAR a: ARRAY N OF INTEGER;
			sum, max, i, k: INTEGER;
	BEGIN
		FOR  i := 0  TO  N - 1  DO
			a[ i ] := 10*i - i*i
		END;
		
		(* фрагмент из книги, с.28: ************************************)
		sum := 0;
		FOR i := 0 TO N-1 DO  sum := a[i] + sum  END;
		k := 0;  max := a[0];
		FOR i := 1 TO N-1 DO
			IF  max < a[i]  THEN  k := i;  max := a[k]  END;
		END;
		(* конец фрагмента ******************************************)
		
		(* вывод в рабочий журнал: *)
		Log.Int( sum );  Log.Ln;
		Log.Int( k );  Log.Int( max );  Log.Ln;
	END For;
(* коммандер для выполнения команды можно вставить прямо в тексте программы, заключив его в комментарий: ADruS14.For *)
	
	
	(* фрагмент из книги, с.29: *************************************)

	PROCEDURE Power ( VAR W: Texts.Writer;  N: INTEGER );
		(* вычислить десятичное представление отрицательных степеней числа 2 *)
		VAR i, k, r: INTEGER;
			d: POINTER TO ARRAY OF INTEGER;
	BEGIN
		NEW( d, N );
		
		FOR k := 0 TO N-1 DO
			Texts.Write(W, "."); r := 0;
			FOR i := 0 TO k-1 DO
				r := 10*r + d[i]; d[i] := r DIV 2; r := r MOD 2;
				Texts.Write(W, CHR(d[i] + ORD("0")))
			END;
			d[k] := 5; Texts.Write(W, "5"); Texts.WriteLn(W)
		END
	END Power;

	(* конец фрагмента *******************************************)
	
	PROCEDURE DoPower*; (* управляющая процедура для Power *)
		VAR  w: Texts.Writer;  N: INTEGER;
	BEGIN
		(* ввод N: *)
		In.Open;  In.Int( N );  ASSERT( In.done & ( N > 0 ) );
		
		(* подготовка w к печати в рабочий журнал (Log): *)
		Texts.OpenWriter( w, Texts.log, Texts.Length( Texts.log ) );
		
		Power( w, N );
		
	END DoPower;

END  ADruS14.

 ADruS14.For 

 ADruS14.DoPower 10
ADru/Mod/S171_Files.odc

(*  Общие сведения о примерах: Справка *)
(*  Исправления и подготовка примеров: (С) Ф.В.Ткачев, 2009, info21 AT inr.ac.ru *)

MODULE ADruS171_Files; (* Реализация модуля Files, сс. 39, 40. *)
	IMPORT  SYSTEM,  Log := StdLog;

	CONST MaxLength = 4096;

	TYPE
		File* = POINTER TO RECORD
			len: INTEGER;
			a: ARRAY MaxLength OF CHAR
		END;
		
		Rider* = EXTENSIBLE RECORD  (* 0 <= pos <= f.len <= MaxLength *)
			f: File;
			pos: INTEGER;
			eof-: BOOLEAN
		END;
	
	
	PROCEDURE New* ( name: ARRAY OF CHAR ): File;
		VAR  f: File;
	BEGIN  NEW(f);  f.len := 0;  RETURN  f
	END New;

	PROCEDURE Old* ( name: ARRAY OF CHAR ): File;
		VAR  f: File;
	BEGIN  HALT( 126 );  RETURN  f
	END Old;

	PROCEDURE Close* ( VAR f: File );
	BEGIN
	END Close;

	PROCEDURE Set* ( VAR r: Rider;  f: File;  pos: INTEGER );
	BEGIN
		ASSERT( f # NIL );
		r.f := f;  r.eof := FALSE;
		IF  r.pos < 0  THEN
			r.pos := 0
		ELSIF  pos > f.len  THEN
			r.pos := f.len
		ELSE
			r.pos := pos
		END
	END Set;

	PROCEDURE Write* ( VAR r: Rider;  ch: CHAR );
	BEGIN
		ASSERT( r.pos <= r.f.len );
		IF  r.pos < MaxLength  THEN
			r.f.a[ r.pos ] := ch;  INC( r.pos );
			IF  r.pos > r.f.len  THEN  INC( r.f.len )  END
		ELSE
			r.eof := TRUE
		END
	END Write;

	PROCEDURE Read* ( VAR r: Rider;  OUT ch: CHAR );
	BEGIN
		IF  r.pos < r.f.len  THEN  ch := r.f.a[ r.pos ];  INC( r.pos )  ELSE  r.eof := TRUE  END
	END Read;
	
	
	(* следующие две процедуры отсутствуют в английском "исходнике" книги;
		они используются в сортировках слиянием: *)
	
	PROCEDURE WriteInt* ( VAR r: Rider;  x: INTEGER );
		VAR  u: RECORD [union]
			x: INTEGER;
			a: ARRAY 2 OF CHAR;
		END;
	BEGIN
		u.x := x;
		Write( r, u.a[ 0 ] );
		Write( r, u.a[ 1 ] );
	END WriteInt;
	
	PROCEDURE ReadInt* ( VAR r: Rider;  OUT x: INTEGER );
		VAR  u: RECORD [union]
			x: INTEGER;
			a: ARRAY 2 OF CHAR;
		END;
	BEGIN
		Read( r, u.a[ 0 ] );
		Read( r, u.a[ 1 ] );
		x := u.x;
	END ReadInt;


	PROCEDURE Base* ( VAR r: Rider ): File;
	BEGIN
		RETURN  r.f
	END Base;

END ADruS171_Files.

ADruS171_FilesTest.Do
ADru/Mod/S174.odc

(*  Общие сведения о примерах: Справка *)
(*  Исправления и подготовка примеров: (С) Ф.В.Ткачев, 2009, info21 AT inr.ac.ru *)

MODULE  ADruS174;  (* Примеры из раздела 1.7.4. *)

	IMPORT  Log := StdLog,  In := i21sysIn,  Texts := ADruS174_Texts;
	
	PROCEDURE Read ( OUT ch: CHAR );
	BEGIN
		In.Char( ch );  ASSERT( In.done );
	END Read;

	PROCEDURE Write ( ch: CHAR );
	BEGIN  Log.Char( ch );
	END Write;


	(* преобразование литер в число из разд. 1.7.4: *)
	
	PROCEDURE ЛитерыВЧисло*; 
		VAR  x: INTEGER;  ch: CHAR;
	BEGIN
		(* приготовление ввода: *)
		In.Open;  ASSERT( In.done );  Read( ch );  ASSERT( In.done );
		
		(* фрагмент из книги, с.47: ************************************)
		x := 0;  Read( ch );
		WHILE ("0" <= ch) & (ch <= "9") DO
			x := 10*x + (ORD(ch) - ORD("0")); Read(ch)
		END;
		(* конец фрагмента ******************************************)
		
		(* проверяем печатью в рабочий журнал: *)
		Log.Int( x );  Log.Ln;
	END ЛитерыВЧисло; 

	
	(* преобразование числа в литеры из разд. 1.7.4: *)
	
	PROCEDURE ЧислоВЛитеры*;
		VAR  x, i: INTEGER;  d: ARRAY 11 OF INTEGER;
	BEGIN
		(* ввод числа: *)
		In.Open;  ASSERT( In.done );  In.Int( x );  ASSERT( In.done & ( x >= 0 ));
		
		(* фрагмент из книги, с.47: ************************************)
		i := 0;
		REPEAT  d[i] := x MOD 10;  x := x DIV 10;  INC( i )
		UNTIL  x = 0;
		REPEAT  DEC( i );  Write( CHR( d[ i ] + ORD("0") ) )
		UNTIL  i = 0;
		(* конец фрагмента ******************************************)
		
		Log.Ln;
	END ЧислоВЛитеры; 
	
END  ADruS174.

ADruS174.ЛитерыВЧисло 12345 
ADruS174.ЧислоВЛитеры  2345 

Для изменения входных данных поменять числа после команд (или выделить число мышкой) -- при клике прочтутся новые данные.
Число здесь должно быть целым, без точки.
ADru/Mod/S183.odc

(*  Общие сведения о примерах: Справка *)
(*  Исправления и подготовка примеров: (С) Ф.В.Ткачев, 2009, info21 AT inr.ac.ru *)

MODULE  ADruS183;
(* К разделу 1.8.3 о поиске в таблице. *)
	IMPORT  Log := StdLog,  In := i21sysIn,  Math;
	
	PROCEDURE Делать*;
		CONST  M = 100;  N = 10;
		TYPE  String = ARRAY M OF CHAR;
		VAR
			T: ARRAY N OF String;
			x: String;
		VAR  i, L, R, m: INTEGER;
	BEGIN
		(*ввод аргумента поиска и таблицы: *)
		In.Open;	ASSERT( In.done );
		In.String( x );	ASSERT( In.done );
		FOR  i := 0  TO  N-1  DO  In.String( T[i] ); ASSERT( In.done )  END;
		(* фрагмент из книги, с.54: ************************************)
		L := 0;  R := N;
		WHILE  L < R  DO
			m := (L+R) DIV 2;
			i := 0;
			WHILE ( x[i] # 0X ) & ( T[m, i] = x[i] ) DO  i := i+1  END;
			IF  T[m, i] < x[i]  THEN  L := m+1  ELSE  R := m  END
		END;
		IF  R < N  THEN
			i := 0;
			WHILE ( x[i] # 0X ) & ( T[R, i] = x[i] ) DO  i := i+1  END
		END;
		(* ( R < N ) & ( T[R,i] = x[i] ) устанавливает совпадение *)
		(* конец фрагмента ******************************************)
		
		Log.Int( R );  Log.Tab;  Log.String( T[R] );  Log.Ln;		
	END Делать;
	
END  ADruS183.

можно менять аргумент поиска (искомое значени; это первая вводимая цепочка литер, стоящая в строке командира) и снова кликать:

ADruS183.Делать  "Единая"
"Оберон"
""
"замечательный язык"
"программирования"
"."
" "
"Единая"
"система"
"вводных"
"курсов"
"информатики"
"на основе"
"Оберонов."
ADru/Mod/S193_БМ.odc

(*  Общие сведения о примерах: Справка *)
(*  Исправления и подготовка примеров: (С) Ф.В.Ткачев, 2009, info21 AT inr.ac.ru *)

MODULE  ADruS193_БМ;
(* Поиск в тексте. Алгоритм Бойера и Мура, раздел 1.9.3. *)
	IMPORT  Log := StdLog,  In := i21sysIn;
	
	CONST  Mmax = 10;  Nmax = 1000;
	VAR
		s: ARRAY Nmax OF CHAR;  N: INTEGER;
		p: ARRAY Mmax OF CHAR;  M: INTEGER;

	(* реализация предикатов, определенных в тексте на с.63: *)
			
	PROCEDURE P ( i, j: INTEGER ): BOOLEAN;  
		VAR  k: INTEGER;
	BEGIN
		k := j;
		WHILE  ( k < M ) & ( s[ i-M+k ] = p[ k ] )  DO  INC( k )  END;
		RETURN  k = M
	END P;
	
	PROCEDURE R ( i: INTEGER ): BOOLEAN; 
		VAR  j: INTEGER;
	BEGIN
		RETURN  P( i, 0 )
	END R;
	
	PROCEDURE Q ( i: INTEGER ): BOOLEAN;
		VAR  k: INTEGER;
	BEGIN
		k := M;
		WHILE  ( k < i ) & ~R( k )  DO  INC( k )  END;
		RETURN  ~( k < i )
	END Q;
	
	(* фрагмент из книги, с.64: **************************************)
	
	PROCEDURE Search ( IN p, s: ARRAY OF CHAR;  M, N: INTEGER;  OUT r: INTEGER );
		(* поиск образца p длины M в тексте s длины N; M <= Mmax *)
		(* если p найден, то r указывает его позицию в s, иначе r = -1 *)
		VAR  i, j, k: INTEGER;
			d: ARRAY 128 OF INTEGER;
	BEGIN 
		FOR  i := 0  TO  127  DO  d[i] := M  END; 
		FOR  j := 0  TO  M-2  DO  d[ ORD( p[j] ) ] := M-j-1  END;

		(* проверки инварианта цикла (показаны красным) вставлены всюду, где инвариант должен выполняться; в целях наглядности этих проверок вставлено больше, чем нужно: было бы достаточно оставить в обоих ветках по одной проверке  в начале или в конце шага *)
		i := M; j := M;  k := i;
		ASSERT( Q(i) & P(i, j) & (k = i-M+j) );
		LOOP IF  (j > 0) & (i <= N) & (s[k-1] = p[j-1])  THEN
			ASSERT( Q(i) & P(i, j) & (k = i-M+j) );
			DEC(k); DEC(j);
			ASSERT( Q(i) & P(i, j) & (k = i-M+j) );
		ELSIF  (j > 0) & (i <= N)  THEN
			ASSERT( Q(i) & P(i, j) & (k = i-M+j) );
			i := i + d[ ORD( s[i-1] ) ];  j := M;  k := i;
			ASSERT( Q(i) & P(i, j) & (k = i-M+j) );
		ELSE EXIT END END;
		ASSERT( Q(i) & P(i, j) & (k = i-M+j) );
		
		IF  j = 0  THEN  r := k  ELSE  r := -1  END;
	END Search;

	(* конец фрагмента *******************************************)
	
	PROCEDURE Проверить*;
		VAR  r: INTEGER;
	BEGIN
		Log.Ln;
		Log.String('Проверяем Бойера-Мура:');  Log.Ln;

		In.Open;  ASSERT( In.done );
		In.String( s );  ASSERT( In.done );  N := LEN( s$ );
		In.String( p );  ASSERT( In.done );  M := LEN( p$ );
		
		Search( p, s, M, N, r );
		
		Log.Int( r );  Log.Ln;
	END Проверить;
	
END  ADruS193_БМ.


ADruS193_БМ.Проверить 
	"Hoola-Hoola girls like Hooligans." "Hooligan"

или можно выделить любую строчку и кликнуть по командиру:
	"Hoola-Hoola girls like Hooligans." "H"
	"Hoola-Hoola girls like Hooligans." "o"
	"Hoola-Hoola girls like Hooligans." "gi"
	"Hoola-Hoola girls like Hooligans." "ns."
	"Hoola-Hoola girls like Hooligans." "gi"
	"Hoola-Hoola girls like Hooligans." "ooo"
	"baaab" "abab"	
	aahaahaa ahaah
ADru/Mod/S242_Runs.odc

(*  Общие сведения о примерах: Справка *)
(*  Исправления и подготовка примеров: (С) Ф.В.Ткачев, 2009, info21 AT inr.ac.ru *)

MODULE ADruS242_Runs;
(* Реализация вспомогательного модуля Runs из раздела 2.4.2, с.105. ********
	Средства модуля используются в различных алгоритмах сортировки слияниями. *)
	IMPORT  Files := ADruS171_Files,  Texts := ADruS174_Texts;

	TYPE
		Rider* = RECORD ( Files.Rider )
			first-: INTEGER;
			eor-: BOOLEAN 
		END;
	
	PROCEDURE OpenRandomSeq*( f: Files.File;  length, seed: INTEGER );
		VAR  i: INTEGER;  w: Files.Rider;
	BEGIN
		Files.Set( w, f, 0 );
		FOR i := 0 TO length-1 DO
			Files.WriteInt( w, seed );  seed := (31*seed) MOD 997 + 5
		END;
		Files.Close( f )
	END OpenRandomSeq;
	
	PROCEDURE Set*( VAR r: Rider;  f: Files.File );
	BEGIN
		Files.Set( r, f, 0 );
		Files.ReadInt( r, r.first );
		r.eor := r.eof 
	END Set;
	
	PROCEDURE copy*( VAR src, dest: Rider );
	BEGIN
		dest.first := src.first;
		Files.WriteInt( dest, dest.first );
		Files.ReadInt( src, src.first );
		src.eor := src.eof OR ( src.first < dest.first )
	END copy;
	
	PROCEDURE ListSeq*( VAR W: Texts.Writer;  f: Files.File );
		VAR  x, y, k, n: INTEGER;  r: Files.Rider;
	BEGIN
		k := 0;  n := 0;
(* Версия из книги. Проверка флажка r.eof должна выполняться немедленно за попыткой чтения ReadInt. Ошибка происходит из попытки оптимизации (сэкономить на повторении группы команд). 
Корректная версия приводится ниже.
		Files.Set( r, f, 0 );  Files.ReadInt( r, x ); 
		WHILE ~r.eof DO
			Texts.WriteInt( W, x, 6 );  INC( k );  Files.ReadInt( r, y );
			IF  y < x  THEN (*конец серии*) Texts.Write( W, "|" );  INC( n )  END;
			x := y
		END;
*)
		(* корректная версия *)
		Files.Set( r, f, 0 );  Files.ReadInt( r, x ); 
		IF  ~r.eof  THEN
			Texts.WriteInt( W, x, 6 );  INC( k );  Files.ReadInt( r, y );
			WHILE  ~r.eof  DO
				IF  y < x  THEN (*конец серии*) Texts.Write( W, "|" );  INC( n )  END;
				x := y;
				Texts.WriteInt( W, x, 6 );  INC( k );  Files.ReadInt( r, y );
			END;
		END;
		
		Texts.Write( W, "$" );  Texts.WriteInt( W, k, 5 );  Texts.WriteInt( W, n, 5 );
		Texts.WriteLn( W ) 
	END ListSeq;
	
	
	PROCEDURE LogSeq*( f: Files.File ); (* то же, что ListSeq, но пишет в Log (рабочий журнал), причем всегда в конце *)
		VAR  x, y, k, n: INTEGER;  r: Files.Rider;  log: Texts.Writer; 
	BEGIN
		Texts.OpenWriter( log, Texts.log, Texts.Length( Texts.log ) );
		
		k := 0;  n := 0;  Files.Set( r, f, 0 );

		Files.ReadInt( r, x ); 
		IF  ~r.eof  THEN
			Texts.WriteInt( log, x, 6 );  INC( k );
			Files.ReadInt( r, y );
			WHILE  ~r.eof  DO
				IF  y < x  THEN (*конец серии*)  Texts.WriteLn( log );  Texts.Write( log, "|" );  INC( n )  END;
				Texts.WriteInt( log, y, 6 );  INC( k );
				x := y;
				Files.ReadInt( r, y );
			END;
		ELSE
			
		END;
		
		Texts.Write( log, "$" );  Texts.WriteInt( log, k, 5 );  Texts.WriteInt( log, n, 5 );
		Texts.WriteLn( log );
		Texts.ShowEnd( Texts.log );
		
	END LogSeq;
	
END ADruS242_Runs.
ADru/Mod/S33_Hilbert.odc

(*  Общие сведения о примерах: Справка *)
(*  Исправления и подготовка примеров: (С) Ф.В.Ткачев, 2009, info21 AT inr.ac.ru *)

MODULE  ADruS33_Hilbert;
(* Рисование гильбертовых кривых из раздела 3.3. *)
	IMPORT  Draw := ADruS33_Draw;
	CONST  right = 0;  up = 2;  left = 4;  down = 6;
	
	(* фрагмент из книги, с.138 *************************************)
	VAR  u: INTEGER;
			(* необходимые упреждающие определения, отсутствующие в книге: *)
			PROCEDURE^ B ( i: INTEGER ); 
			PROCEDURE^ C ( i: INTEGER );
			PROCEDURE^ D ( i: INTEGER );
	
	PROCEDURE A ( i: INTEGER );
	BEGIN
		IF  i > 0  THEN
			D( i - 1 );  Draw.line( left, u );
			A( i - 1 );  Draw.line( down, u );
			A( i - 1 );  Draw.line( right, u );
			B( i - 1 )
		END
	END A;
	
	PROCEDURE B ( i: INTEGER );
	BEGIN
		IF  i > 0  THEN
			C( i - 1 );  Draw.line( up, u );
			B( i - 1 );  Draw.line( right, u );
			B( i - 1 );  Draw.line( down, u );
			A( i - 1 )
		END
	END B;
	
	PROCEDURE C ( i: INTEGER );
	BEGIN
		IF  i > 0  THEN
			B( i - 1 );  Draw.line( right, u );
			C( i - 1 );  Draw.line( up, u );
			C( i - 1 );  Draw.line( left, u );
			D( i - 1 )
		END 
	END C;
	
	PROCEDURE D ( i: INTEGER );
	BEGIN
		IF  i > 0  THEN
			A( i - 1 );  Draw.line( down, u );
			D( i - 1 );  Draw.line( left, u );
			D( i - 1 );  Draw.line( up, u );
			C( i - 1 )
		END
	END D;
	
	PROCEDURE Hilbert* ( n: INTEGER );
		CONST  SquareSize = 512;
		VAR  i, x0, y0: INTEGER;
	BEGIN
		Draw.Clear;
		x0 := Draw.width DIV 2;  y0 := Draw.height DIV 2;
		u := SquareSize;
		i := 0;
		REPEAT
			INC( i );
			u := u DIV 2;
			x0 := x0 + (u DIV 2);  y0 := y0 + (u DIV 2);  Draw.SetPen( x0, y0 );
			A( i )
		UNTIL  i = n
	END Hilbert;
	
	(* конец фрагмента *******************************************)
	
END  ADruS33_Hilbert. 

При клике по одному из нижеприведенных командиров в отдельном окошке рисуется гильбетрова кривая соответствующего порядка.
При повторных кликах рисунок перерисовывается в том же окошке:

"ADruS33_Hilbert.Hilbert(1)"
"ADruS33_Hilbert.Hilbert(2)"
"ADruS33_Hilbert.Hilbert(3)"
"ADruS33_Hilbert.Hilbert(4)"
"ADruS33_Hilbert.Hilbert(5)"
"ADruS33_Hilbert.Hilbert(6)"
"ADruS33_Hilbert.Hilbert(7)"

Если окошко с рисунком случайно закрылось, кликнуть сюда:

DevDebug.UnloadThis  ADruS33_Hilbert ADruS33_Sierpinski ADruS33_Draw

Для копирования получившихся картинок в текст (см. такую копию ниже): 
	отрегулировать размер окна, Ctrl+Space, Ctrl+C, 
в тексте, куда надо вставить картинку: 
	Edit, Paste Special..., выбрать Picture (Metafile).