#LyX 2.1 created this file. For more info see http://www.lyx.org/
\lyxformat 474
\begin_document
\begin_header
\textclass article
\begin_preamble
%вчегда ставить отступ, даже в начале
\usepackage{indentfirst}
%\renewcommand{\baselinestretch}{1.25}
%\usepackage[12pt]{extsizes}
\usepackage{float}
%переименовать объект алгоритм
\floatname{algorithm}{Листинг}
%\newcommand{\algorithmname}{Listing}
%позволить добавление списка литературы в содержание
%\usepackage{tocbibind}
\usepackage[nottoc]{tocbibind} %получаем ToC без включения его самого же
\end_preamble
\use_default_options true
\begin_modules
figs-within-sections
tabs-within-sections
eqs-within-sections
\end_modules
\maintain_unincluded_children false
\language russian
\language_package default
\inputencoding auto
\fontencoding global
\font_roman default
\font_sans default
\font_typewriter default
\font_math auto
\font_default_family default
\use_non_tex_fonts false
\font_sc false
\font_osf false
\font_sf_scale 100
\font_tt_scale 100
\graphics default
\default_output_format default
\output_sync 0
\bibtex_command default
\index_command default
\paperfontsize 12
\spacing onehalf
\use_hyperref true
\pdf_bookmarks true
\pdf_bookmarksnumbered false
\pdf_bookmarksopen false
\pdf_bookmarksopenlevel 1
\pdf_breaklinks false
\pdf_pdfborder true
\pdf_colorlinks true
\pdf_backref false
\pdf_pdfusetitle true
\papersize a4paper
\use_geometry true
\use_package amsmath 1
\use_package amssymb 1
\use_package cancel 1
\use_package esint 1
\use_package mathdots 1
\use_package mathtools 1
\use_package mhchem 1
\use_package stackrel 1
\use_package stmaryrd 1
\use_package undertilde 1
\cite_engine basic
\cite_engine_type default
\biblio_style plain
\use_bibtopic false
\use_indices false
\paperorientation portrait
\suppress_date false
\justification true
\use_refstyle 1
\index Index
\shortcut idx
\color #008000
\end_index
\leftmargin 2cm
\topmargin 3cm
\rightmargin 2cm
\bottommargin 3cm
\secnumdepth 3
\tocdepth 3
\paragraph_separation indent
\paragraph_indentation default
\quotes_language french
\papercolumns 1
\papersides 1
\paperpagestyle default
\tracking_changes false
\output_changes false
\html_math_output 0
\html_css_as_file 0
\html_be_strict false
\end_header

\begin_body

\begin_layout Subsection
Язык Простого Рефала
\end_layout

\begin_layout Standard
Прежде чем говорить об языке Простого Рефала рассмотрим некоторые общие
 положения 
\begin_inset Quotes fld
\end_inset

базисного рефала
\begin_inset Quotes frd
\end_inset


\begin_inset CommandInset citation
LatexCommand cite
key "key-2"

\end_inset

, который можно рассматривать как его основу.
\end_layout

\begin_layout Standard
Язык рефал является одномерным знаковым языком.
 Его объекты --- последовательности минимальных нерасчленимых синтаксических
 единиц --- атомарных символов (здесь и далее, атомарные символы будут называтьс
я более коротко --- атомами).
 Атомами могут быть:
\end_layout

\begin_layout Itemize
Символы (байты, ASCII-символы);
\end_layout

\begin_layout Itemize
Составные символы (то есть, имена, определённые в тексте программы) или,
 просто идентификаторы;
\end_layout

\begin_layout Itemize
Целые числа (десятичная запись без знаковых целых числе, обычно, в диапазоне
 
\begin_inset Formula $0\,..\,2^{32}-1$
\end_inset

).
\end_layout

\begin_layout Standard
Составными термами являются последовательности символов, заключенные либо
 в структурные (круглые) скобки, либо в функциональные (угловые).
\end_layout

\begin_layout Standard
Исходный текст программы на языке рефал представляет собой набор определений
 программных сущностей.
 Для базисного рефала --- программной сущностью является функция.
 Пример определения и вызова функции приведён в листинге 
\begin_inset CommandInset ref
LatexCommand ref
reference "alg:Пример-определения"

\end_inset

.
 При этом, в единице трансляции не может быть определено более одной программной
 сущности с одним и тем же именем.
 Если тело функции не содержит предложений, то вызов такой функции приводит
 к аварийному останову.
\end_layout

\begin_layout Standard
Введем понятие выражения, как последовательности атомов и скобок, соответствующи
х следующим правилам:
\end_layout

\begin_layout Itemize
Пустое объект есть выражение;
\end_layout

\begin_layout Itemize
Атом есть выражение;
\end_layout

\begin_layout Itemize
Последовательность выражений есть выражение;
\end_layout

\begin_layout Itemize
Выражение в функциональных или структурных скобках есть выражение;
\end_layout

\begin_layout Itemize
Остальные объекты, к которым не применимы правила выше не являются выражениями.
\end_layout

\begin_layout Standard
\begin_inset Float algorithm
placement H
wide false
sideways false
status open

\begin_layout Plain Layout
\begin_inset Caption Standard

\begin_layout Plain Layout
Пример определения и вызова функции на языке базисного рефала.
\begin_inset CommandInset label
LatexCommand label
name "alg:Пример-определения"

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset listings
lstparams "language=C,basicstyle={\ttfamily},tabsize=2"
inline false
status open

\begin_layout Plain Layout

/* Определение функции WriteLine */
\end_layout

\begin_layout Plain Layout

WriteLine {
\end_layout

\begin_layout Plain Layout

  образец = результат;
\end_layout

\begin_layout Plain Layout

  ...
\end_layout

\begin_layout Plain Layout

}
\end_layout

\begin_layout Plain Layout

\end_layout

\begin_layout Plain Layout

/* Вызов функции WriteLine с аргументом 'Hello, World!' */
\end_layout

\begin_layout Plain Layout

<WriteLine 'Hello, World'>
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Standard
Легко заметить, что функции в языке рефал оперируют с выражениями и возвращают
 их же.
\end_layout

\begin_layout Standard
Рассмотрим структуру предложений на языке рефал.
 Предложения состоят из двух частей --- образца и результата.
 Обе части состоят из выражений и разделены между собой символом '='.
 Предложение обязано оканчиваться символом ';'.
 Пример предложения: 
\begin_inset listings
lstparams "language=C,basicstyle={\ttfamily}"
inline true
status open

\begin_layout Plain Layout

'a' s.T 'c' = <WriteLine s.T>;
\end_layout

\end_inset

.
 
\end_layout

\begin_layout Standard
Переменные бывают трёх типов, соответствуя синтаксическому типу тех объектов,
 которые могут быть их значениями.
 Переменная обозначается парой знаков --- признака переменной и произвольного
 объектного знака.
 Для изображения признака выражения используется символ --- 
\begin_inset Formula $e$
\end_inset

, для признака терма --- 
\begin_inset Formula $t$
\end_inset

, для признака символа --- 
\begin_inset Formula $s$
\end_inset

.
 Пример переменных: 
\begin_inset listings
lstparams "language=C"
inline true
status open

\begin_layout Plain Layout

eA, sT, tP
\end_layout

\end_inset

.
 
\end_layout

\begin_layout Standard
Рассмотрим принимаемые значения переменных для соответствующих признаков:
\end_layout

\begin_layout Itemize
e-переменные могут принимать любое выражение;
\end_layout

\begin_layout Itemize
t-переменные могут принимать любой терм, например, 
\begin_inset listings
lstparams "language=C"
inline true
status open

\begin_layout Plain Layout

P, (PQ)
\end_layout

\end_inset

;
\end_layout

\begin_layout Itemize
s-переменные могут принимать только атомы.
\end_layout

\begin_layout Standard
Выполнением алгоритма, представленного на языке рефал, занимается специальное
 вычислительное устройство --- рефал-машина.
 В общем представлении, рефал-машина это устройство пошагового выполнения,
 состоящие из двух потенциально бесконечных запоминающих устройств: привычной
 памяти и поля зрения.
 Полем зрения называют область памяти, содержащее выражение, требующее конкретиз
ации.
 Во многих реализациях рефал-машин принято использовать реализацию поля
 зрения на основе двусвязного списка узлов, описывающих либо атом, либо
 скобку.
\end_layout

\begin_layout Standard
Теперь перейдем к рассмотрению особенностей языка Простого Рефала и его
 отличий от базисного.
\end_layout

\begin_layout Standard
Во-первых, в Простом Рефале помимо функций в качестве программных сущностей
 также используются идентификаторы.
 Исходный текст программ расширяется до набора объявлений и определений
 программных сущностей.
 У программных сущностей появился тип доступа --- локальный и глобальный.
 Локальные функции имеют область видимости в рамках файла, в котором они
 объявлены.
 Глобальные же функции (они же entry-функции) могут быть видны в любом файле,
 при условии добавления её в область видимости файла директивой $EXTERN.
 Такие функции должны иметь уникальные имена для всей программы.
\end_layout

\begin_layout Standard
Идентификаторы в Простом Рефале состоят из последовательности латинских
 букв, цифр и знаков '-', '_', начинающихся с заглавной латинской буквы.
 Переменные, в отличии от базисного рефала, уже могут обозначаться минимум
 двумя знаками.
 Первым знаком всегда идёт признак переменной, а далее, идёт идентификатор,
 структура которого соответствует описанному чуть ранее принципу.
 Для идентификаторов понятия типа доступа отсутствует.
 Идентификатор объявляется следующим образом
\begin_inset Newline linebreak
\end_inset

 
\begin_inset listings
lstparams "language=C,basicstyle={\ttfamily}"
inline true
status open

\begin_layout Plain Layout

$LABEL Идентификатор1, ...
 , ИдентификаторN;
\end_layout

\end_inset

.
\end_layout

\begin_layout Standard
Ещё одним существенным отличием Простого Рефала является необходимость объявлени
я или определения функциональной сущности до её применения.
 Для этого предусмотрены директивы $FORWARD и $EXTERN, для локальных и глобальны
х функций соответственно.
\end_layout

\begin_layout Standard
Для сохранения некоторого состояния текущего поля зрения существует понятие
 статических ящиков, которые помещают перечисленные имена в пространство
 имён как определённые имена локальных (директива $SWAP) или entry-функций
 (директива $ESWAP).
 Статические ящики представляют собой функции с состоянием.
 При вызове аргумент своего предыдущего вызова, при первом вызове возвращает
 пустое выражение.
 В некотором роде статический ящик можно рассматривать в качестве механизма
 реализации глобальной переменной в программе.
 Для чтения значения из статического ящика необходимо сначала вызвать ящик
 с любым аргументом, запомнить то, что он возвратил, снова вызвать с тем,
 что он возвратил за первый вызов и отбросить результат второго вызова —
 первый вызов извлекает хранимое значение, второй его восстанавливает.
\end_layout

\begin_layout Standard
Ещё одним преимуществом Простого Рефала является наличие вложенных функций.
 Пример использования вложенной функции приведён в листинге 
\begin_inset CommandInset ref
LatexCommand ref
reference "alg:Пример-вложенной-функции"

\end_inset

.
\end_layout

\begin_layout Standard
Более подробно об особенностях языка Простого Рефала, его отличии от таких
 диалектов, как Рефал-5, Рефал-7 и познакомиться со стандартной библиотекой
 можно на ресурсах 
\begin_inset CommandInset citation
LatexCommand cite
key "key-3,key-4"

\end_inset

.
\end_layout

\begin_layout Standard
\begin_inset Float algorithm
placement H
wide false
sideways false
status open

\begin_layout Plain Layout
\begin_inset Caption Standard

\begin_layout Plain Layout
Пример вложенной функции на языке Простого Рефала.
\begin_inset CommandInset label
LatexCommand label
name "alg:Пример-вложенной-функции"

\end_inset


\end_layout

\end_inset


\end_layout

\begin_layout Plain Layout
\begin_inset listings
lstparams "basicstyle={\ttfamily}"
inline false
status open

\begin_layout Plain Layout

/* Определение функции без вложенной функции */
\end_layout

\begin_layout Plain Layout

DeNumerate {
\end_layout

\begin_layout Plain Layout

	(s.Num e.Value) = e.Value;
\end_layout

\begin_layout Plain Layout

}
\end_layout

\begin_layout Plain Layout

DoSomething {
\end_layout

\begin_layout Plain Layout

  e.NumeratedSet = <Map DeNumerate e.NumiratedSet>; 
\end_layout

\begin_layout Plain Layout

}
\end_layout

\begin_layout Plain Layout

/* Определение функции со вложенной функции */
\end_layout

\begin_layout Plain Layout

DoSomething {
\end_layout

\begin_layout Plain Layout

  e.NumSet = <Map { (s.Num e.Value) = e.Value; } e.NumSet>; 
\end_layout

\begin_layout Plain Layout

}
\end_layout

\end_inset


\end_layout

\end_inset


\end_layout

\end_body
\end_document
