and end include to
by exit not type
constant for or while
do function procedure with
else global return without
elsif if then xor
Редактор Euphoria отображает эти занятые слова в синем цвете.
Идентификаторы служат для объявления и последующего использования следующих структурных единиц (элементов) языка:
* процедур
* функций
* типов
* переменных
* констант (постоянных)
В процедурах выполняются разнообразные действия и они могут иметь список аргументов (параметров), то есть,
procedure empty()
end procedure
procedure plot(integer x, integer y)
position(x, y)
puts(1, '*')
end procedure
В круглых скобках, следующих за именем объявляемой процедуры, вы через запятые пишете список аргументов (если они вам необходимы). В первом примере пустая процедура не имеет аргументов. Во втором примере хотя и показан список, состоящий всего из двух аргументов, это не означает, что допустимая длина списка как-то ограничена. Кроме того, каждый из аргументов может быть рядом произвольной структуры и длины. Во многих языках списки агрументов с переменной длиной вообще невозможны. А в языке C вы должны для этого установить странные механизмы, которые настолько сложны, что среднему программисту приходится каждый раз перечитывать руководство или консультироваться с местными гениями.
В процедуру подаётся копия величины каждого из аргументов. Временные (формальные) переменные, описывающие каждый из аргументов, могут быть модифицированы вами внутри процедуры и повторно использованы, но эти модификации никак не затрагивают собственно величины подаваемых в процедуру аргументов. То есть, модификации не затрагивают фактическую переменную, подаваемую в процедуру, а касаются только её формальной копии.
Примечание о производительности: Интерпретатор на самом деле копирует ряды или числа с плавающей точкой только в тех случаях, когда это становится действительно необходимо, например:
y = {1,2,3,4,5,6,7,8.5,"ABC"}
x = y
Команда присваивания x = y фактически не создает новую копию y, содержащуюся в x. После выполнения этой команды и x, и y будут просто "указывать" на один и тот же ряд, заданный выражением для y ранее. Если мы позже выполним x[3] = 9, то для x в памяти будет создана новая копия (хотя всё ещё будет только одна общая (для x и y) копия числа с плавающей точкой 8.5 и для внутреннего ряда "ABC"). Такой же приём работает по отношению к "копиям" аргументов, подаваемых в подпрограммы (подпрограмма - это общий термин для процедур, функций и типов).
Функции очень похожи на процедуры, но они выдают результат в виде некоторой величины и поэтому могут быть использованы в выражениях, то есть,
function max(atom a, atom b)
if a = b then
return a
else
return b
end if
end function
Любой объект Euphoria может быть выдан функцией. Вы можете, по сути, иметь множество выдаваемых величин, записав выдачу ряда объектов, например,
return {x_pos, y_pos}
Мы будем использовать общий термин "подпрограмма", когда наше замечание относится одновременно и к процедурам, и к функциям.
В Euphoria имеются специальные функции, которые используются для объявления допустимых величин переменных. Тип должен иметь строго один аргумент и выдавать атом, который может иметь два значения - истина (не-нуль) или ложь (нуль). Типы также могут быть вызваны подобно другим функциям. См. 2.4.3 Задание типа переменной.
Переменным могут быть присвоены значения во время исполнения программы, например,
-- x можно присвоить только целочисленную величину
integer x
x = 25
-- a, b и c можно присвоить *любую* величину
object a, b, c
a = {}
b = a
c = 3.14
Когда вы объявляете переменную, вы даёте ей имя (которое позже предохраняет вас от ошибок правописания) и, задавая тип, определяете величины, которые могут быть законно присвоены вашей переменной во время исполнения программы.
Константы - это такие переменные, которым однажды присваивается некоторая начальная величина и изменить эту величину в дальнейшем уже невозможно, например,
constant MAX = 100
constant Upper = MAX - 10, Lower = 5
constant name_list = {"Fred", "George", "Larry"}
Константе может быть присвоено значение любого выражения, даже результат вычисления предварительно определённой функции, но после присвоения величины константа "защищается" от дальнейших изменений остановкой программы и сообщением об ошибке.
Константы не могут быть объявлены внутри объявления подпрограмм.
2.4.2 Сцена (область видимости)
Каждый объявленный в программе идентификатор имеет сцену, то есть тот участок в общем тексте программы, где его объявление действует, то есть, где этот идентификатор является видимым и доступным для использования интерпретатором при очередных вычислениях, выполняемых им по ходу программы.
В Euphoria имеется множество предопределённых (так сказать, заранее объявленных, а точнее, встроенных) процедур, функций и типов. Все они объявляются автоматически перед стартом любой программы. Редактор Euphoria отображает их имена в малиновом цвете. Эти предопределённые имена не являются занятыми словами, и вы можете переопределить их своими собственными подпрограммами.
Каждое новое имя в вашей программе перед его дальнейшим использованием должно быть объявлено, а структурная единица программы (переменная, подпрограмма, константа) фигурирующая под этим именем, должна быть вами определена. Такая дисциплина, действующая в Euphoria, позволяет вам читать программу последовательно от начала и до конца без необходимости забегания вперёд, чтобы раскрыть значение заинтриговавшего вас слова, которое уже вовсю используется автором программы, но действительный смысл которого ещё окутан тайной, которая скрывается где-то в дебрях кода, спутанного как итальянские макароны в кастрюле. Тем не менее, если необходимость в опережающей ссылке на подпрограмму существует и оправдана упрощением кода, вы можете предусмотреть вызов подпрограммы по особому её номеру, значение которого будет вычислено в вашей программе позже, но не по имени, которое ещё не объявлено. Для этого в Euphoria имеются специальная функция, routine_id(), и, соответственно, подпрограммы call_func() или call_proc(), одна для функций, а другая для процедур. См. Часть II - Библиотека подпрограмм - Динамические вызовы.
В процедурах, функциях и типах разрешены рекурсивные вызовы, когда подпрограмма вызывает саму себя. Взаимная рекурсия, где подпрограмма A вызывает подпрограмму B, которая прямо или косвенно вызывает подпрограмму A, также возможна, но требует использования механизма routine_id().
Имя считается известным интерпретатору от точки, в которой оно было объявлено, до границы его сцены. Сцена переменной, объявленной внутри подпрограммы (частной переменной) ограничена концом подпрограммы. Сцена всех других переменных, констант, процедур, функций и типов ограничена концом файла исходного кода, в котором они объявлены, и все они называются местными (локальными). Если объявлению на уровне файла предшествует ключевое слово global (глобальный), то сцена в этом случае может простираться за пределы файла, в котором записано объявление, но правила, по которым сцена ограничивается, становятся не слишком простыми.
Когда вы включаете библиотечный файл Euphoria в свой главный файл (см. 2.6 Специальные команды высшего уровня), то только переменные и подпрограммы, объявленные в библиотечном файле с использованием ключевого слова global, оказываются доступными или даже видимыми в вашем главном файле. Другие, не-глобальные, объявления в библиотечном файле видны интерпретатору только до конца библиотечного файла, и вы можете повторно использовать их имена, не опасаясь, что местные переменные, уже работающие в пределах библиотечного файла, будут в этом случае как-то задеты из вашего главного файла. И напротив, если вы попытаетесь обратиться к местной переменной или подпрограмме библиотечного файла по их именам из вашего главного файла, то получите аварийную остановку программы с сообщением об ошибке "not declared" - "не объявлено".
Имена, объявленные как global, могут действовать и вне того файла, где они объявлены. Но все другие имена действуют только внутри их собственного файла. Это обстоятельство очень полезно при сопровождении или усовершенствовании библиотечного файла или при изучении его работы и использования. Вы можете делать изменения в его внутренних (местных и частных) переменных и местных подпрограммах до тех пор, пока эти изменения не затрагивают работу глобальных переменных и подпрограмм, и вам не нужно будет заботиться о необходимости тестирования других файлов или извещать пользователей библиотеки.