
- •6.1.2.2. Присваивание ссылок на объект
- •7. Дистанционное обращение
- •7.1. Дистанционные идентификаторы
- •7.2. Присоединения
- •9.2. Квазипараллельное исполнение
- •Integer procedure pos;
- •Inspect sysout do inspect sys in do
- •11.4.2. Семантика
- •1 12.1. Последовательности псевдослучайных чисел
- •14.2.3.2. Семантика
- •14.2.4. Управляющие процедуры
Integer procedure pos;
Процедура X.pos доставляет в качестве своего значения текущее значение указателя позиции ссылки на текст X.
procedure setpos (/); integer /:
Действие процедуры X. setpos (i) состоит в том, что указателю позиций ссылки на текст X присваивается значение /, если I находится в интервале [1, X. length + 1]. В противном случае присваивается значение X. length + 1.
Boolean procedure more;
Процедура X. more доставляет значение true, если указатель позиции ссылки X находится в интервале [Г, X. length]. В противном случае она имеет значение false,
character procedure getchar;
Процедура Л7, getchar доставляет в качестве своего значения копию доступной в данный момент литеры текста X при условии, что значением Х.тоге является true. В противном случае выдается сообщение об ошибке. Если ошибки не про-. изошло, после выполнения копирования указатель позиции текста X увеличивается на единицу.
procedure putchar (с); character (с);
Действие процедуры Л7-putchar (с) состоит в том, что доступная в данный момент литера текста X заменяется копией литеры с при условии, что значением A".more является true. В противном случае выдается сообщение об ошибке. Если не произошло ошибки, после выполнения замены указатель позиции текста X увеличивается на единицу.
Пример:
т
procedure уплотнить (Т); text T; begin text U; character с;
Г.setpos (1); U :-T;
for с : = с while U . more do
begin с : = U . getchar ;
if с ф "_" then T . putchar (c)
end;
for c: = c while T.more do T. putchar ("Jf) end уплотнить;
Процедура переупорядочивает литеры текстового значения, на которое ссылается параметр Г. Литеры, отличные отпробела, собираются в левой части текста, а оставшаяся часть, если таковая имеется, заполняется литерами пробела. Поскольку параметр вызывается по ссылке,' то его указательпозиции не меняется. Значением литерной константы "_" яв ляется литера пробела.
10.4. ПОРОЖДЕНИЕ ТЕКСТОВ
Для порождения объектов типа текст, в дальнейшем для краткости называемых просто текстами, имеются следующие основные процедуры. Эти процедуры в отличие от рассмотренных выше не локализовании в текстовых объектах.
text procedure blanks (n); integer n;
Эта процедура доставляет в качестве своего значения ссылку*на новый текстовый объект длины п, заполненный литерами пробела.
text procedure text (Г); value Г; text T;
Эта процедура доставляет в качестве своего значения ссылку на новый текстовый объект, являющийся копией текстового значения, на которое ссылается или которым является фактический параметр.
Пример:
оператор Г:—text ('ABC'), где Т есть текстовая переменная, эквивалентен составному оператору
begin Г: —blanks (3); Г: =9АВС end :
10.5. ПРИСВАИВАНИЕ ТЕКСТОВЫХ ССЫЛОК
(Синтаксис см. разд. 6.1).
к
i
Результатом текстового присваивания ссылок является то, что присваиваемая ссылка становится новым содержимым ЛЧ. Это новое содержимое ЛЧ .является копией ссылки, получающейся при вычислении ПЧ (см. .разд. 6.2). Присваиваемая ссылка включает в себя также копию указателя пози-
Г.ии ПЧ. .■'"'*
Если X есть текстовая переменная, а У — ссылка на текст, то после выполнения присваивания ссылок X: — У оба отношения X = =У и X.pos = y.pos имеют значение true.
Ь 10.6. ПРИСВАИВАНИЕ ТЕКСТОВЫХ ЗНАЧЕНИЙ
^ (Синтаксис см. разд. 6.1).
Пусть значением ЛЧ присваивания текстового значения является текст длины Lt, а значением ПЧ — текст длины Lr. Если ПЧ сама является присваиванием текстового значения, то Lr по определению есть длина текста, присвоенного при выполнении этой ПЧ в качестве присваивания. Результат при сваивания текстового значения зависит от соотношения между LI и Lr. ■
LI = Lr: Литеры значения ПЧ переписываются последовательно в значение ЛЧ.
Ll> Lr. Литеры значения ПЧ переписываются последовательно в первые Lr позиции значения ЛЧ. -Остальные LI — Lr позиций значения ЛЧ заполняются пробелами.
'LKLr- При исполнении такого присваивания выдается со- ] г . общение об ошибке.
г ™
1 ' Если ЛЧ и ПЧ ссылаются на пересекающиеся тексты, то результат присваивания текстового значения определяется-конкретной реализацией языка.
При выполнении присваивания текстового значения указатели позиций ЛЧ и ПЧ во внимание не принимаются и не изменяются. ■
Если X и Y суть тексты одинаковой длины, то после исполнения присваивания текстового значения X: = У отношение X = Y имеет значение true.
10.7. ПОДТЕКСТЫ
Имеются две процедуры для обращений к подтекстам: 1) text procedure sub (i,n)\ integer i,n;
Пусть / и п — такие целые числа, что /^ 1, пХ), и 7 + п<СХ.length + 1. Тогда выражение X.sub (i,n) ссылается на ту часть текстового значения X, первая литера которой является t-й литерой значения X и которая содержит п последующих литер. Указатель позиции в получаемой ссылке на текст равен единице и определяет местную нумерацию литер в подтексте. Указатель позиции значения X во внимание не принимается и не изменяется. В особом случае, когда п = 0, получаемая ссылка есть notext. Если i и п не удовлетворяют указанным выше условиям, то при выполнении процедуры выдается сообщение в ошибке.
Логические
выражения:
Пользователь может по своему усмотрению создавать структуры классов, соответствующие содержанию решаемых задач. Каждый из классов может иметь последовательность префиксов произвольной глубины. , " . ■ - '
С другой стороны, классы, используемые в качестве префиксов, могут разрабатываться заранее и входить в язык как • его составные части. В этом случае пользователь получает возможность обращаться к понятиям и методам, описанным в таком «системном» классе, употребив его в качестве префикса к своей программе или к ее части.
Содержание, таких системных классов может быть самым разнообразным: класс ПЛАНИМЕТРИЯ, класс БУХГАЛТЕРСКИЙ УЧЕТ, класс МЕДИЦИНСКАЯ ДИАГНОСТИКА и т. п. Системный класс может описывать те или иные свой-ства» методы и понятия в терминах, принятых в соответствующей области, и представлять, таким образом, некоторый специализированный язык. В результате программа, имеющая этот класс в качестве своего префикса, может быть также написана на специализированном языке.
Таким образом, введение классов позволяет не только опи сывать различные иерархически построенные структуры дан ных и правила действий, но и легко осуществлять специали зацию языка. ■ '
Читателю, возможно, известен язык СИМУЛА-1, предназначенный для описания сложных систем с дискретными" событиями. Не будет преувеличением сказать, что до последнего времени этот язык был наилучшим инструментом моделирования на ЭВМ, завоевавшим популярность в нашей стране и за рубежом.
Отрадно отметить, что все средства моделирования, соот- . ветствующие языку СИМУЛА-1 (параллельное функционирование объектов, управление последовательностью действий/ получение случайных чисел, обработка статистики и т. п.), являются частью языка СИМУЛА-67 и ими можно воспрль-р зоваться через системный класс МОДЕЛИРОВАНИЕ. ... ■■'■.
Введение в язык классов заставило разработать новые средства для ссылок на объекты. Предложенные авторами " решения этой проблемы привлекают своим удобством, наглядностью и эффективностью с точки зрения их реализации., ■
■ Интересной особенностью языка является использование уац щзьщъщщ виртуальных велцчин^ которые сцецифици-
и
п Ф 0 :=э X. main = =X.sub(tt n).main
если они законны, оба имеют значение true.
2) text procedure strip ;
Выражение Л7, strip эквивалентно выражению X.sub (1, га), где п есть наибольшее целое число, такое, что литеры значения X в позициях под номерами, большими п, если таковые имеются, все суть литеры пробела.
Пусть X и К —ссылки на текст. Тогда после присваивания значения X ;= У, если оно не приводит" к ошибке, отно: шение X . strip = У. strip имеет значение true.
10.8. ЧИСЛОВЫЕ ТЕКСТОВЫЕ ЗНАЧЕНИЯ
*. i
10.8.2. Семантика
*
Синтаксис, определенный в разд. 10.8.1, относится к последовательностям литер, т.е. текстовым значениям.
Каждый ТЕРМИНАЛЬНЫЙ СИМВОЛ означает подходящую литеру из внешнего набора литер, определяемого конкретной реализацией. ПРОБЕЛ означает литеру пробела. РАЗДЕЛИТЕЛЬ означает некоторую литеру, определяемую реализацией. Эта литера может быть, например, пробелом или запятой. .
Запись числа — это последовательность литер, являющаяся продукцией понятия (ЗАПИСЬ ЧИСЛА).
Для преобразования арифметических значений в текстовые (являющиеся записями чисел) и обратно имеются процедуры редактирования и дередактирования.
10.9. ПРОЦЕДУРЫ ДЕРЕДАКТИРОВАНИЯ
Любая процедура дередактирования данной ссылки на текст X работает следующим образом:
1) разыскивается самая длинная запись числа (если таковая имеется) требуемого типа, содержащаяся в X и содержащая первую литеру текста X (заметим, что запись числа любого типа может начинаться с любого количества пробелов);
" 2) если такой записи числа нет, то выдается сообщение об ошибке.
в противном случае найденная запись числа интерпре тируется как число;
если это число выходит за пределы диапазона значе ний, определяемого реализацией, то выдается сообщение об ошибке;
в противном случае вычисляется арифметическое зна чение, которое равно или приближенно равно этому числу;
указатель позиции ссылки X становится на единицу больше,,чем номер последней литеры рассмотренной записи числа. с
Имеются три процедуры дередактирования:
1) integer procedure getint;
- Процедура разыскивает (ЗАПИСЬ ЦЕЛОГО). Значение, доставляемое этой процедурой-функцией, равно целому значению, представляемому найденной записью целого.
2) real procedure getreal;
Процедура разыскивает (ЗАПИСЬ ВЕЩЕСТВЕННОГО). Значение, доставляемое этой процедурой-функцией, равно или приблизительно равно вещественному значению, пред ставляемому найденной записью вещественного. Если это значение целое и находится в пределах диапазона, допусти- могб в данной реализации для целых чисел, то преобразова ние происходит точно. ; 3) integer procedure getfrac ; .
'* Процедура разыскивает (ЗАПИСЬ ГРУППАМИ). При интерпретации записи группами процедура игнорирует любой (РАЗДЕЛИТЕЛЬ) или десятичную точку, если таковые имеются. Значение, доставляемое этой процедурой-функцией, равно получающемуся таким образом целому значению.
- /
10.10. ПРОЦЕДУРЫ РЕДАКТИРОВАНИЯ
4
Г
Процедуры редактирования данной ссылки на текст X служат для преобразования арифметических значений в записи чисел. После операции редактирования полученная запись числа (если таковая получена) выравнивается вправо в тексте X и ей предшествует столько пробелов, сколько необходимо для заполнения всего текста. Окончательное значение указателя позиции ссылки Х- равно X. length + 1.
Положительное число редактируется без знака, отрица тельное число редактируется со знаком минус, который непо средственно предшествует следующей значащей литере. Ве дущие незначащие нули подавляются, кроме, быть может, нуля, непосредственно предшествующего первой значащей литере. ' ■ ■
Если X = notext, то выдается сообщение об ошибке. В про тивном случае, если - текстовое значение слишком коротко, чтобы вместить получающуюся запись числа, происходит «пе реполнение при редактировании» и в текст помещается не которая последовательность литер по правилам, определен ным реализацией языка. Кроме того, если в ходе выполнения программы произошло переполнение при редактировании, то по окончании выполнения программы выдается соответствую щее сообщение об этом факте.
Имеются четыре процедуры редактирования
1) procedure putint (/); integer /;
Значение параметра преобразуется в (ЗАПИСЬ ЦЕЛОГО), обозначающую это значение.
2) procedure putfix (r, n)\ real r; integer n;
Получающаяся запись числа есть ЗАПИСЬ ЦЕЛОГО, если п = О, или ЗАПИСЬ МАНТИССЫ, у которой ЗАПИСЬ ДРОБИ содержит п цифр, если п > 0. Она обозначает число, равное или приближенно равное значению параметра л, правильно округленному до я-го десятичного знака. Если п < 0, то выдается сообщение об ошибке.
„ 3) procedure putreal (г, п)\ real r; integer n\ ' Процедура формирует ЗАПИСЬ ВЕЩЕСТВЕННОГО, содержащую ПОРЯДОК. Если п = 0, то эта запись вещественного имеет вид (ЗНАКОВАЯ ЧАСТЬ) (ПОРЯДОК); если п = 1, то вид (ЗАПИСЬ ЦЕЛОГО) (ПОРЯДОК), причем (ЗАПИСЬ ЦЕЛОГО) содержит точно одну цифру; если п> 1, то вид (ЗАПИСЬ МАНТИССЫ) (ПОРЯДОК), причем в дробной части мантиссы содержится ровно п— 1 цифр; если п < 0, то выдается сообщение об ошибке.
Сформированная запись вещественного обозначает число, представимое в указанной форме и ближайшее к значению параметра. ' ■
В случае когда имеется два таких числа, берется большее по модулю.
4) procedure putfrac (/, п); integer /, n;
Процедура формирует ЗАПИСЬ ГРУППАМИ без десятичной точки, если п = 0, и с десятичной точкой, за которой следует п цифр, если п > 0. Каждая группа за исключением, быть может, первой и последней (если она в дробной части), состоит из трех цифр. Сформированная запись числа является точным представлением числа i. 10n.
Процедуры редактирования и дередактирования предназначены для обработки текстов «фиксированной длинЪ!».
Пример: " -,
text Tr, тип , количество , цена , сумма ;
integer сум, итого;
Гл: —blanks (80); тип: — Tr .sub (1,10);
количество : — Tr . sub (20,5); цена : — Tr. sub (30,6);
сумма : — 7V . sub (60,10):
if тип . strip = y заказ1 then
begin сум : = количество. getint X цена . getfгас;
итого : ~ итого + сум ;
.сумма .putfrac (сум, 2) end
11. ВВОД —ВЫВОД
Семантика средств языка, описывающих процессы ввода— вывода, основана на понятии «файл» (т. е. картотеки, наборов данных и т. п.). Файл представляет собой массив данных, внешних"* по отношению к программе. Мы будем .говорить
о «последовательном файле» или об «адресном файле» в зависимости от его организации.
Примеры последовательных файлов:
пачка перфокарт,
последовательность печатных строк,
ввод с клавиатуры,
данные на ленте. *■
Примером. адресного файла является массив элементов информации на магнитном барабане или диске, когда каждый элемент обозначается посредством некоторого индекса.
Отдельные элементы информации, составляющие файл, будут называться «образами». Каждый «образ» является упорядоченной последовательностью литер. Средства для «без-форматного ввода — вывода» не являются частью базы языка СИМУЛА-67.
Средства языка, описывающие процессы ввода — вывода, вводятся посредством префиксов к блокам. В дальнейшем изложении такой набор средств будет описываться классом под названием BASICIO. Этот класс не может быть явно доступным для какой-либо программы пользователя. Программа действует так, как если бы она была заключена в следующие блоки:
■
BASICIO (гс) begin