Кажется, мы окончательно пришли к минималистичности языка и специализации объектов языка.
Вот например: типы, которые есть в языке:
Код:
Типы данных базовые (элементарные, основные):
- булевское, boolean; true, false; истина, ложь; да, нет
- целое,integer;десятичные; целые не имеют размера (длинные, реализованы программно);
- дробное, real; стандартный вид; размер соответствует типу double в С++ (IEEE-754-1985)
- символ, character;‘один_символ’; кодировка - ?
Вариант – letter, литера
Литералы (только элементарные типы):
-целое число – десятичное произвольного размера,
-дробное число – соответствует типу double в IEEE-754-1985,
-символ – один символ в апострофах (одиночная кавычка) – кодировка - ?
-строка – см. ниже о массивах
Внимание! Встроенного типа «строка» - нет.
- Строка – это массив символов.
- Строковые литералы: последовательность символов в кавычках - “строка”
- Размер строкового литерала = количество символов
Операции
- логические: ~ (not), & (and), | (or), ^ (xor)
- сравнения: = (равно), #(не равно), <(меньше), >(больше), <=, >=
- арифметика целая: + - * \ % (вопрос: целое деление – специальный знак?)
- арифметика дробная: + - * /
Никаких неявных преобразований, кроме integer -> real
Думаем о том, чтобы как-то задавать кодировку символов в явном виде. Неявность тут не есть хорошо.
Массивы
Массив объявляется в том же операторе variable.
Типом массива является [размер] тип
Примечание. Возможно специальное ключевое слово и отдельное объявление массива:
массив [размер] тип имя
английское слово array
Семантика:
– нет начальных значений, нет констант!
– тип элементов может быть любой, в том числе массивом, записью, указателем и процедурным типом
– числовые элементы массива при объявлении обнуляются;
– булевские элементы массива при объявлении принимают значение false (ложь = ноль)
– массивы – только одномерные; многомерный массив трактуется как «массив массивов… массивов…»
– размер – это целочисленное выражение = количество элементов;
– размер вычисляется при выполнении программы
– размер массива можно получить с помощью метода размер(), который возвращает целое число типа integer
m.size() – английский вариант
м.размер() – русский вариант
Индекс – изменяется от 0 до N-1, если N– размер массива.
Индекс проверяется на корректность во время выполнения программы
Каждый индекс задаётся в скобках [индекс]
Массив типа [размер] char – это массив символов;
при объявлении элементы обнуляются;
Надо ли разрешать инициализацию? Криминала не наблюдается.
Поскольку у нас нет компилятора как такового, то нет необходимости различать массив с константным размером и массив с вычисляемым во время выполнения программы. Поэтому нет указателей на массив и нет динамических массивов - они у нас все изначально по определению динамические...
Пока размышляем, надо ли разрешать операции с массивами, или нехай студни массивы обрабатывают исключительно в циклах ручками.
Единственный массив, которому можно присваивать значения - это массив символов:
Записи – процедурная часть (без наследования и ООП)
запись поля; методы; конец
английское слово record
английское слово end
Альтернатива
английское слово class
русское слово группа
русское слово структура
русское слово кортеж
русское слово тип - выбрали вот этот вариант.
Семантика
нет начальных значений, нет констант!
полем записи может быть объект любого типа, в том числе массив, указатель на тип, объект-запись
Вопрос: поле записи – процедурная переменная; пока разрешаем
Отметим: объявление полей = объявление переменных без инициализации!
Вместо слова переменная используется слово поле; английское field
Запись определяет:
– тип объектов
– пространство имён
Тип объектов
– определяется на уровне модуля
- тип используется с момента объявления
- тип локален в модуле; можно сделать тип публичным
Пространство имён
-все имена видны внутри записи независимо от места объявления
- все имена считаются локальными в записи;
- даже если тип объявлен публичным, имена все равно являются локальными в записи
– любое имя, определённое в записи, может быть явно сделано публичным
Доступ к открытым элементам записи
осуществляется только при объявлении объекта данного типа с помощью селектора – точка
Записи-объекты создаются
a) статически – обычное объявление переменной
b) динамически – во время выполнения программы в динамической памяти.
Только для записей определены указатели
Указатель на запись
variable тип имя; – в качестве типа требуется задать указатель на тип записи
указатель-на тип
Вариант:
^ тип
* тип
Замечание. На месте первого символа можно написать любой иероглиф, обозначающий указатель
Семантика
нет констант!
тип – только объявленный тип записи
необходим практически только для создания динамических структур данных из объектов-записей
при объявлении получает значение (специальное) – пусто (nil)
может быть полем записи
может быть элементом массива
Совместимость по присваиванию - должны совпадать типы записей.
Процедурный тип
(параметры) – тип переменной-процедуры
(параметры): тип – тип переменной-функции
Примечание. Возможно специальное ключевое слово и отдельное объявление переменной - процедуры:
процедура (параметры)имя;
функция (параметры): тип имя;
Семантика
– нет констант!
– необходим практически только для того, чтобы передавать процедуру как параметр
– при объявлении процедурной переменной она получает значение (специальное) – пусто (nil)
– процедурной переменной может быть присвоено имя любой процедуры с таким же прототипом.
(в том числе и стандартной) – в компонентном паскале - запрещено
– начальные значения есть - ? (похоже, можно разрешить)
– совместимость по присваиванию – точное совпадение списка параметров по типам
Примеры объявлений:
Переменные скалярные
variable тип имя;
variable тип имя, имя, …, имя;
variable тип имя, тип имя, …, тип имя;
variable тип имя := выражение;
variable тип имя := выражение, имя := выражение, тип имя, …, имя := выражение;
variable тип имя := выражение, тип имя, имя := выражение,…, тип имя := выражение;
русское слово: переменная
Константы – требуется явный тип и инициализация
constant тип имя = выражение;
constant тип имя = выражение, имя = выражение,…;
constant тип имя = выражение, тип имя = выражение,…;
Внимание: выражение вычисляется во время интерпретации
русское слово: константа
Важное замечание: константа может быть только элементарного типа.
Отметим: перечисление – это просто сокращение явного объявления констант.
constant
целый воскресенье = 0, понедельник = 1, вторник = 2; -- и так далее
Замечание: в данном варианте отсутствует присвоение общего имени набору констант.
-----------------------------------------------------------------------------------------------------------
переменная массив [размер] тип имя;
переменная указатель на тип имя;
переменная процедура(параметры) имя;
переменная функция(параметры):тип имя;
Присваивание:
Альтернатива: пусть
Английское слово let
скалярные переменные базовых типов
присвоить имя := выражение;
Выражение по типу должно совпадать или приводиться к типу имени
Единственная операция неявного приведения: integer ->real
массив символов - единственный вариант присваивания массиву выражения.
присвоить имя := строковый_литерал;
Размер строкового литерала не должен превосходить размера массива
Элемент массива
присвоить имя[индекс] := выражение;
Выражение по типу должно совпадать или приводиться к типу имени
Вопрос: элементом массива может быть массив. Разрешается ли присваивание такого элемента ?
И вопрос с присваиванием массивов. Либо вообще запрещаем, либо разрешаем.
Тогда возврат из функции массива надо разрешать.
Семантика присваивания может быть разная
– либо размеры и тип элементов совпадают;
– либо – не совпадают;
Поле записи
присвоить полное_имя := выражение;
Вид выражения зависит от типа поля записи
Выражение по типу должно совпадать или приводиться к типу имени
Указатель на запись
присвоить имя_указателя := имя_указателя;
присвоить имя_указателя := new(тип-записи);
Указатели по типу записи должны совпадать
Тип записи в операции new () должен совпадать с типом записи указателя
Процедурная переменная
присвоить имя_пп := имя_процедуры;
Переменная имя_пп и процедура с именем имя_процедуры должны иметь точно совпадающий список параметров
варианты присваивания (Дейкстра)– не нужно, так как редактор семантический ?
присвоить имя, имя,… := выражение; присвоить одно выражение нескольким переменным-- это бывает полезно
Пока как-то так