суббота, 23 октября 2010 г.

Типы данных, объектные выражения

Программа на Рефале представляет собой функции, сгруппированных в модули. Функции являются одноаргументными, аргументы и результаты функций представляют собой иерархические структуры, называемые объектными выражениями. Объектное выражение представляет собой последовательность объектных термов (далее мы увидим, что существуют и другие виды термов), каждый из которых может быть или неделимым (атомом), или содержать в себе другое объектное выражение (назовём его составным термом).

Модульный Рефал поддерживает следующие типы атомов:
  1. атомы-литеры или символы (characters) — представляют собой символы как элементы текста;
  2. атомы-числа — представляют собой целые числа из ограниченного множества;
  3. атомы-имена или идентификаторы — слова, состоящие из букв латинского алфавита, цифр и символов − и _, начинаются с заглавной буквы;
  4. атомы-замыкания или атомы-функции — в текущей реализации представляют собой указатели на функции, применяются при косвенном вызове. Подробнее о них будет рассказано в соответствующей главе.
Атомы-литеры записываются как соответствующие символы в одинарных кавычках. Примеры: 'A' '8' ')' 'ѣ'. Если в записи объектного выражения несколько символов идут подряд, то записывать их можно вместе, так например 'отмелькала''отмель' 'кала' и 'о' 'т' 'м' 'е' 'л' 'ь' 'к' 'а' 'л' 'а' — три способа способа записи одного и того же объектного выражения из 10 атомов.

Помимо обычных символов, поддерживаются также escape-последовательности: символы '\n', '\r', '\t' и '\\' означают соответственно символ перевода строки, возврата каретки, табуляции и backslash’а.

Атомами-числами в текущей реализации Рефала являются целые числа, лежащие в диапазоне от 0 до 2³² − 1, записываются как обыкновенные десятичные числа: 1, 42, 666, 4294967295.

Атомы-имена или идентификаторы предназначены в целом для решения тех же задач, что и перечислимые типы во многих языках программирования (C++, C#, Visual Basic, Pascal) — описывают некоторое значение по имени. Однако, в отличие от упомянутых языков, в Рефале их не надо предварительно объявлять и им не поставлены в соответствие целые числа. Примеры идентификаторов: True, Success, Right, Left, NotFound.

Примечание. Традиционно при описании типов данных Рефала используется другая терминология: вместо термина атом используется термин символ (symbol). Таким образом говорят о символах-литерах, символах-числах и т. д. Я сознательно отошёл от такой терминологии, чтобы не вносить путаницу между атомами-литерами (characters) и символами (symbol).

К составным термам относятся:
  1. простые скобочные термы — записываются как объектные выражения, заключённые в круглые (структурные) скобки;
  2. так называемые абстрактные типы данных (АТД) — особые скобочные термы, ассоциированные с именем абстрактного типа данных, записываются в квадратных («абстрактных») скобках, внутри которых записывается объектное выражение, предварённое именем АТД. Подробнее о них написано в соответствующей главе.
Пример объектного выражения:

('*' ('+' 10 N) ('−' T D)) [Table (N 10) (T 20) (D 5)]

Это объектное выражение состоит из двух составных термов. Первый терм является простым скобочным термом, содержащий в свою очередь три терма, первый из которых атом, два других составные. Второй терм является АТД, содержит внутри себя три терма. Заметим, что Table это вовсе не идентификатор, а имя типа данных.