:h1.Первая страница
:p.
:artwork align='center' name='0001-Intro\Images\Selene.bmp'.

:p.
Selene - функциональный язык программирования с выводом 
типов, созданный на основе языков R-5, Orion и Veronica. 
В языке используются такие приёмы, как вложенные функции, 
запись выражений в обратном порядке, передача функций на 
вход других функций - и многие другие.

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

:p.
В следующем примере на языке Selene выполняется расчёт
частоты, с которой слова встречаются в тексте:

:p.
:font facename=Courier.
:include mode='code' file='0105-HiFunctions\Include\Frequency-3+Text.rc'.
:font facename=default.

:p.
Текст в виде одной длинной строки передаётся в функцию
"frequency()" в параметре "text", а статистика по словам 
складывается в переменную "fq", это хеш-таблица, она же 
список ключей и значений. Если слова в списке нет, оно 
добавляется со значением, равным единице, а если слово 
есть в списке - связанное с ним значение увеличивается 
на единицу.

:p.
Ещё один пример - выбор из списка значений по формуле
гипотенузы:

:p.
:font facename=Courier.
:include mode='code' file='0201-Operators\Include\Topology-C+Nearest.rc'.
:font facename=default.

:p.
Здесь оператор "[#]" пробегает по списку в параметре
"items" и сравнивает расстояния от каждого элемента 
списка до элемента в том же списке, номер которого 
задаётся в параметре "n". Он создаёт новый список,
содержащий значения, расположенные ближе к элементу
с этим номером, чем расстояние в параметре "distance".
Новый список становится возвращаемым значением функции
"nearest()".

:p.
Помимо запрета на изменение данных (кроме функции, в 
которой они были созданы), Selene запрещает глобальные
переменные - то есть, место в общей области видимости 
занято под объявления типов данных, но не переменных:

:p.
:font facename=Courier.
:include mode='code' file='0001-Intro\Include\Variables-1.rc'.
:font facename=default.

:p.
В заголовке программы допустимы только описания структур
данных, а переменную с таким же названием надо создавать 
в точке вызова основной функции:

:p.
:font facename=Courier.
:include mode='code' file='0001-Intro\Include\Variables-2.rc'.
:font facename=default.

:p.
Здесь переменная типа "state" передаётся в безымянную
функцию, вызываемую из функции "msg-in()", с правами на 
чтение - и она создаёт и заполняет новую переменную типа 
"state". Этот приём, так называемое "протаскивание" (оно 
же "явная передача состояния"), вместе с ограничениями на 
изменение данных, позволяет разделить программу на несколько 
потоков в любой точке - и выполнять несколько действий 
одновременно.

