Главная страница

М. В. Ломоносова Факультет вычислительной математики и кибернетики Е. И. Большакова, Н. В. Груздева Основы программирования на языке Рефал Учебное пособие


Скачать 0.92 Mb.
НазваниеМ. В. Ломоносова Факультет вычислительной математики и кибернетики Е. И. Большакова, Н. В. Груздева Основы программирования на языке Рефал Учебное пособие
Анкорqewqe
Дата02.01.2022
Размер0.92 Mb.
Формат файлаdoc
Имя файлаRefalP-1.doc
ТипУчебное пособие
#323127
страница10 из 22
1   ...   6   7   8   9   10   11   12   13   ...   22

2.5.Функции для работы с копилкой


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

В языке Рефал-2 рефал-машина, кроме поля памяти и поля зрения, имеет ещё одно запоминающее устройство, называемое копилкой. Копилка является некоторым аналогом глобальных переменных в императивных языках программирования, она даёт возможность именовать и хранить рефал-выражения, предоставляя доступ к ним из любой точки программы.

Копилка содержит последовательность структурных термов вида:

(имя1'='выражение1)(имя2'='выражение2)...(имяN'='выражениеN)

где имя1, имя2, ..., имяN и выражение1, выражение2, ..., выражениеN – произвольные объектные выражения. Единственное ограничение, накладываемое на выражения имя1, имя2, ..., имяN – они не могут содержать на верхнем уровне символ-литеру '='.

Смысл копилки и том, что в ней под именами имя1, имя2, ..., имяN закопаны соответственно рефал-выражения выражение1, выражение2, ... , выражениеN. Перед началом работы программы копилка пуста.

Работа с копилкой осуществляется с помощью встроенных функций Br (Burry – закопать), Dg (Dig Out – выкопать), Cp (Copy – скопировать), Rp (Replace – заменить) и Dgall (Dig Out All – выкопать всё). Все эти функции, кроме функции Cp, имеют побочный эффект – они меняют содержимое копилки.

Обращение к функции Br имеет вид имя'='выражение>, при его вычислении в поле зрения сам этот вызов заменяется пустым выражением, а содержимое копилки изменяется – в начало содержащейся в копилке последовательности термов добавляется терм (имя'='выражение), т.е. аргумент функции Br, заключенный в структурные скобки.

Обращение к функции Dg имеет вид имя>. Эта функция просматривает содержимое копилки от начала в конец в поисках терма вида (имя'='выражение) и если находит его, удаляет этот терм из копилки. Результатом обращения к функции является выражение, оно заменяет в поле зрения исходное функциональное обращение. Если же указанный терм в копилке не найден, то в качестве результата выдается пустое выражение.

Функция Cp имеет тот же формат, что и Dg, и работает аналогичным образом, за исключением того, что содержимое копилки не меняется, т.е. найденный терм (имя'='выражение) остается в копилке.

Обращение к встроенной функции Rp имеет вид имя'='новое_выражение>, при его вычислении в поле зрения этот вызов заменяется пустым выражением, а в копилке ищется самый первый терм вида (имя'='выражение) и заменяется термом (имя'='новое_выражение). Если же в копилке не обнаружено терма искомого вида, то функция Rp делает то же самое, что и функция Вr, т.е. добавляет в начало копилки терм (имя'='новое_выражение).

Функция Dgall позволяет вынуть из копилки всё содержимое и поместить его в поле зрения рефал-машины, т.е. вызов заменяется в поле зрения последовательностью термов – текущим содержимым копилки, т.е. последовательностью хранящихся в ней термов, начиная с первого. В результате вычисления этого вызова копилка становится пустой.

Можно заметить, что копилка представляет собой также некоторый аналог стека. Так, если под одним и тем же именем было закопано несколько выражений (например, было выполнено: , а затем ), то выражение, закопанное последним по времени (в нашем примере – терм ('X=B')), будет находиться в начале копилки. После этого функцией Dg или Cp с аргументом 'Х' в копилке будет найден терм ('X=B'), и значением функции будет выражение 'В'. Аналогичным образом вычислится и вызов функции Rp: в результате него произойдёт замена выражения с заданным именем, закопанного в копилку последним по времени.

2.6.Оформление и запуск программы


В системе программирования Рефал-2 исходная рефал-программа должна быть подготовлена в виде текстового файла с расширением .ref.Текст программы представляет собой последовательность строк, в которых используются только первые 72 позиции (остальные позиции игнорируются для совместимости со старыми реализациями языка). Если рефал-предложение занимает больше, чем 72 позиции, все его символы, начиная с 73-го, при загрузке в поле памяти обрезаются. Если для записи рефал-предложения требуется большее число позиций, оно записывается на нескольких строках. Для переноса предложения с одной строки на другую служит собственный знак +, его можно поставить всюду, где допустимы незначащие пробелы, и затем продолжить запись предложения на следующей строке.

Кроме предложений рефал-функций в тексте программы возможны директивы и строки комментария. Строка комментария начинается с литеры *, после которой идут символы комментария. Комментарии игнорируются рефал-интерпретатором и не влияют на выполнение рефал-программы. Допустимы также пустые строки и строки, состоящие из одних пробелов, которые также не влияют на исполнение рефал-программы и могут использоваться для наглядности её записи.

Основное место в рефал-программах занимают описания рефал-функций, состоящие из последовательности предложений. Каждое рефал-предложение записывается на отдельной строке, длинные предложения могут занимать несколько подряд идущих строк. Первое предложение любой функции должно начинаться с идентификатора – имени функции, которое записывается с первой позиции строки. Остальные предложения функции записываются без имени, после начального пробела. Все предложения без имени, вплоть до первого предложения другой функции (или директивы), относятся к этой функции.

При описании в рефал-программе спецификатора его имя также должно быть записано с первой позиции строки.

Как указывалось ранее, имена функций являются символами-метками (но при их записи в функциональных обращениях разрешено опускать знаки косой черты). Язык Рефал-2 требует обязательного описания всех символов-меток, используемых в программе. Это означает, что если некоторые символ-метки используются в программе не в качестве имён функций, а как мнемоничные обозначения в обрабатываемом выражении, они должны быть описаны как пустые функции.

Пустой называется функция, в которой нет ни одного предложения (поэтому функциональное обращение к пустой функции приводит к останову «отождествление невозможно»). Описание пустой функции состоит из одной строки, на которой с первой позиции записано имя функции. Например, следующие две строки описывают пустые функции с именами Psi и Alpha:

Psi

Alpha

Более компактно пустые функции можно описать с помощью специальной директивы EMPTY, которая имеет следующий вид:

EMPTY список_идентификаторов

где список_идентификаторов задаёт имена определяемых пустых функций.

список_идентификаторов ::= идентификатор |
идентификатор, список_идентификаторов

В этой директиве системное слово EMPTY должно быть отделено от начала строки по крайней мере одним пробелом. Приведём пример директивы – описание пустых функций Psi и Alpha:

EMPTY Alpha,Psi

Все используемые в программе встроенные функции должны быть объявлены в директиве EXTRN, имеющей следующий вид:

EXTRN список_объявлений

список_объявлений ::= объявление_функции |
объявление_функции, список_объявлений

объявление_функции ::= внешнее_имя |
внутреннее_имя(внешнее_имя)

Слово EXTRN должно быть отделено от начала строки по крайней мере одним пробелом.

Внешнее имя – это имя встроенной функции языка Рефал-2. При желании можно ввести в программе другие, внутренние имена для встроенных функций. Например, встроенные функции Mul и Sub можно использовать в программе под другими именами, если записать в программе директиву:

EXTRN умножение(Mul),разность(Sub)

После такого объявления встроенные функции Mul и Sub в программе должны использоваться под именами умножение и разность соответственно.

Рефал-программа должна начинаться с директивы START и кончаться директивой END. Общая структура программы такова:

Идентификатор START

рефал-предложения и директивы

END

В первой строке программы, перед словом START обычно ставится идентификатор – имя программы, но он может быть и опущен. Перед системными словами START и END должен стоять по крайней мере один пробел.

Запуск рефал-программы осуществляется функцией с именем Go, которая должна быть объявлена в программе директивой ENTRY:

ENTRY Go

причём перед словом ENTRY должен стоять по крайней мере один пробел. Функция Go предназначена для инициализации поля зрения рефал-машины, и её описание должно состоять из одного предложения:

Go = рабочее_выражение

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

Приведём пример рефал-программы, запрашивающей у пользователя целое положительное число, вычисляющей факториал этого числа и выводящей результат вычисления на экран.

Factorial START

* Программа вычисления факториала

* Объявление встроенных функций

EXTRN умножить(Mul),M1,Prout,Card

ENTRY Go

* Функция Go инициализирует поле зрения

Go = +

>

* Объявление встроенных функций

EXTRN numb,cvd

* Функция вычисления факториала

fact v(D)1 = >>>

E1 =

* Вспомогательная функция

fact1 (v1)/1/ = v1

(v1)v2 = )>

END

Для запуска рефал-программы, находящейся, к примеру, в файле с именем prog.ref, достаточно поместить указанный файл в директорию Refal2 и набрать в командной строке refgo prog.ref.

Для отладки рефал-программ следует учесть, что интерпретатор языка Рефал-2 во время своей работы в качестве функциональных скобок использует символы k и . (вместо < используется k, а вместо > – точка), а имена всех функций записаны как символы-метки. Именно в таком виде выводится содержимое поля зрения в случае аварийного останова.
1   ...   6   7   8   9   10   11   12   13   ...   22


написать администратору сайта