РУКОВОДСТВО ПО ЯЗЫКУ ПРОГРАММИРОВАНИЯ ATOL
Номер версии: 1.0


ОГЛАВЛЕНИЕ

Что такое ATOL ?
Как это работает ?
Что такое атом ?
Символы языка
Структура программы
Описание функций
Объявление переменных
Модульность
Объекты
Глобальные объекты
Встроенные функции:
Установка значения переменной (set)
Функции для работы с атомами
Функции консольного ввода/вывода
Функции условного выполнения команд
Функции сравнения
Функции для работы с логикой
Математические функции
Дополнительные функции
Поддержка внешних библиотек

Что такое ATOL ?
ATOL - это язык программирования. Он базируется на атомах (другими словами на строках). Даже числа воспринимаются им как атомы. Отсюда следует, что типизации переменных тут нет, потому что они все одного типа. Соответственно, нет необходимости указывать тип для переменных и функций. Синтаксис языка очень простой, в нем нет ничего лишнего. Изначально, ATOL поддерживает только консольный ввод-вывод данных. Но благодаря поддержке внешних библиотек (DLL), он может поддерживать все что угодно. К примеру, в комплекте с ATOL идут библиотеки для расширенной работы с консолью (atol_console.dll), файлового ввода/вывода (atol_file.dll) и создания графического интерфейса (atol_gui.dll). В отличии от других языков программирования ATOL задумывался так, чтобы быть интерпретируемым, то есть чтобы не создавать исполняемых файлов, и что более важно - интерпретатор языка должен быть очень компактным (менее 32 КБ), потому что интерпретатор входит в состав программы на ATOL, другими словами - исполняемая программа на ATOL это скомпилированный файл *.atoc и интерпретатор (причем имена файлов должны быть одинаковыми!). Но с другой стороны было понятно, что никому бы не хотелось прикладывать к своей программе исходный текст. Изходя из этого, скомпилированный файл кодируется (и получает расширение "atoc"). Так что, никто просто так не сможет увидеть хотя бы примерное содержание программы.
	Текущие ограничения:

	* Длина атома не должна превосходить 127 символов.
	* Не более 63 вложенных вызовов функций в параметрах для другой функции.
	* Встроенная функция read не может считать больше, чем 1023 символа.
	* Отсутствие полной поддержки объектно-ориентированного программирования.
	* Отсутствие библиотеки для поддержки файлов atol_file.dll.
	* Отсутствие инструмента для замены стандартной иконки файла интерпретатора.
	  Но Вы можете сами заменить иконку с помощью какой-либо существующей программы.
Можете свободно использовать ATOL в своих целях.
Автор не несет никакой ответственности за использование ATOL.

 
Как это работает ?
Когда интерпретатор запускается, он ищет в текущей папке файл с расширением 'atol' и таким же именем как и у него (к примеру если назвать интерпретатор my_prog.exe, то он будет искать файл my_prog.atol). Если файл '*.atol' найден, то интерпретатор считает, что это текст программы на языке ATOL и пытается его откомпилировать и выполнить. Если же он ничего не нашел, то пытается найти файл с таким же именем как и у него, но с расширением 'atoc'. В таких файлах сохраняется откомпилированная и зашифрованная программа после процесса компиляции. Если он его найдет, то расшифрует и будет выполнять. Иначе будет выдано сообщение об ошибке. Таким образом для работы программы нужен или файл *.atol или *.atoc.
 
Что такое атом ?
Атом - это по сути строка произвольных символов. Если атом не содержит разделительных симполов, то его можно записывать просто как эту строку, иначе его нужно взять в кавычки или апострофы.
Пример: atom1, "Hello World!", my_func, 123, МойАтом.
 
Символы языка
Как было сказано во введении, ATOL полностью основывается на атомах. Таким образом, все символы языка - имена переменных и функций, их значения - это атомы.
 
Структура программы
Программа представляет собой последовательность определений функций. В любом месте программы можно ставить комментарии. Комментарием считается любая последовательность символов между знаком процента (%) и концом строки. Также есть многострочные комментарии - любая последовательность символов между двумя знаками решетки (#). Перечисления параметров функций происходит через разделитель: комментарий (% ...), пробел, символы табуляции, символы конца строки, запятая (,), точка с запятой (;). Вызовы в теле функции также могут перечисляться через любой из вышеприведенных разделителей. Подобно С/С++, программе необходима главная функция main, которая является точкой входа в программу и выполняется при ее старте. Остальные функции запускаются напрямую или косвенно из main. Преимущество ATOL в том, что функциям ненужно быть определенным выше места использования. Использовать функцию можно как после, так и до ее объявления - задумываться где объявлена функция не нужно, главное, чтобы она вообще была :)
 
Описание функции
Определение функции схоже с языком C/C++:
	my_func(param)
	{
		...		% тело функции
	}

	или:

	#
	  многострочные комментарии
	#
	'super mega function!'(arg0 arg1 arg2)
	{
		...
	}

	или:

	function_with_no_args
	{
	}
Функция может вернуть значение двумя способами: или с помощью встроенной функции return, или же результатом функции будет последнее вычисленное выражение.
Как и в любом другом языке высокого уровня допускаются рекурсивные вызовы функций.
Имена параметров функции (как и переменных) не должны совпадать с уже существующими именами функций.
 
Объявление переменных
1) Локальные переменные

Локальные переменные объявляются с помощью вызова ко встроенной функции var внутри тела функции (в том числе внутри функции with и if). Допускается объвлять новые переменные в любой части функции.
	важная_функция(a b c)
	#
	  Пример объявления локальных переменных
	#
	{
		var(var1 var2) % Переменные объявлены в начале функции.
		...
		var( d )  % объявление переменной в середине функции.
		...
	}
Нельзя создавать переменные с именами существующих функций или переменных в текущей области видимости.
Переменные имеют облать видимости. То есть, к примеру, если переменная создана в теле условного оператора, то за его пределами такой переменной существовать не будет.
	my_func0(arg)
	{
		var(v0)
		...
		if eq(arg null)
		{
			var(v0)
			...
			with console
			{
				var(v0)
				...
			}
		}
		else
		{
			var(v0)
			...
		}
	}

2) Глобальные переменные

Глобольные переменные создаются путем использования функции var в глобальной области, то есть за пределами функции. Глобальные переменные видны в функции независимо от того были ли они объявлены до этой функции или после.
	% create new global var 'myvar-1' :
	var( myvar-1 )

	main  % main function.
	{
		set( myvar-1 'hello world!!!' )
		set( myvar-2 'the second global var!!!' )
	}

	% create new global var 'myvar-2' :
	var( myvar-2 )

3) Глобальные переменные, создаваемые динамически, внутри функции

Создаются вызовом к функции g_var( name0 name1 ... ). Использование данной функции полностью аналогично использованию функции var. Просто эта функция вместо локальных переменных создает глобальные. Следует понимать, что до создания глобальной переменной локально, в теле функции, она не существует (в отличии от простого создания глобальных переменных, используя var).
 
Установка значения переменной (set)
Функция set производит установку значения переменной.
	set(destination, source)
	% Пример:
	set(abc 'value for abc')
	set("my long long variable", "hello hello hello!!!")
	set(a, abc)    % Присвоение значения переменной от другой переменной.

 
Функции для работы с атомами
У всех нижеперечисленных функций (кроме concat и append) есть следующая особенность - функции позволяют вызывать себя с дополнительным первым параметром - имя переменной, в которую будет помещен результат операции.
 
Имя функцииЧисло аргументовОписание
length1 Возвращает длину атома (естественно, в виде атома)
left2 left(num atom)
Возвращает num левых символов заданного атома
right2 right(num atom)
Возвращает num правых символов заданного атома
middle3 middle(Start N Atom)
Возвращает N символов заданного атома Atom, начиная с позиции Start
concat> 1 Соединяет параметры в один атом и возвращает его
append> 2 Соединяет параметры, начиная со второго, в один атом и записывает результат в первый параметр
head1 Возвращает первый символ атома
tail1 Возвращает аргумент, за исключением первого символа
last1 Возвращает последний символ заданного аргумента
reverse1 Перестанавливает символы в обратном порядке (abc -> cba).
null* Возвращает пустой атом (''). Можно вызвать со списком параметров-переменных, которые будут обнулены.

 
Функции консольного ввода/вывода
Набор функций для работы с консолью присутствует в ATOL изначально. В начале работы программы консоли нет на экране. Она появляется при первом обращении к функции вывода в консоль.
 
Имя функцииЧисло аргументовОписание
write> 0 Вывод одного или нескольких атомов в консоль
writenl, writeln>= 0 Как и write вывод набора атомов, но данная функция переводит строку.
nl0 Перевод строки
read0, 1 Ввод с консоли атома. При этом, если функция вызвана от одного аргумента (имя переменной), то в него будет занесен результат ввода. Иначе, эта функция просто вернет введенное значение.
readchar0, 1 Ввод одного символа с ожиданием. Работает как и read, но без вывода на экран.

 
Функции условного выполнения команд
В ATOL присутствует стандартный набор функций для условного выполнения команд.
	if <условие> <действие>
	if <условие> <действие> else <действие иначе>
Если действий несколько, то они обрамляются фигурными скобками ({}). Истинным значением условия считается непустой атом. Если атом пустой, то это значение считается ложным.
 
Функции сравнения
Все функции из этого раздела сравнивают и возвращают результат в виде атома: пустой атом ('') для ложного значения и непустой атом для истинного.
 
Имя функцииЧисло аргументовОписание
eq> 1 Истина, если все атомы равны.
eqi> 1 Работает как и eq, но сравнивает без учета регистра символов.
like2, 3 like(mask atom)
Проверяет, подходит ли атом atom под заданную маску mask. Маска может содержать специальные символы ? (один любой символ) и * (любое число любых символов, в том числе и никаких символов). Функция возвращает логический результат. Позволяет вызвать себя с тремя параметрами, при этом в первый параметр заносится результат функции над остальными двумя параметрами.
Пример:
like(ab* abc) - true
like(ab*e abcde) - true
like(he?l?_*ld hello_world) - true
like(12345? 12345) - false

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

 
Имя функцииЧисло аргументовОписание
and> 1 Истина, если все значения истинны
or> 1 Истина, если хотя бы одно значение истинно
not1, 2 Истина, если параметр ложен. Если вызывается от двух параметров, то в первый (имя переменной) заносится значение функции от второго параметра.

 
Математические функции

 Вся работа с математикой реализуется через функцию eval(...). Ей можно передать произвольное число аргументов. Сначала она объединяет все аргументы в единый атом, а затем уже вычисляет его. На данный момент эта функция умеет оперировать только 32-разрядными целыми числами.
Поддерживаемые операции:
a) высокий приоритет:

* умножение
/ деление
\ остаток от деления
^ возведение в степень
& побитовое И
! побитовое НЕ
() скобки

b) низкий приоритет
+ сложение
- вычитание
> больше (сравнение чисел - результат 0(ложь) или 1(истина))
< меньше
= равно
| побитовое ИЛИ
~ побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ (сложение по модулю 2)

 
Дополнительные функции

 
Имя функцииЧисло аргументовОписание
return1 Возвращает результат функции, немедленно завершая выполнение функции (как в C/C++)
assert> 1 assert(bool msg ...)
Если выражение bool ложно, то останавливает работу программы и выводит сообщение об ошибке msg (все параметры после bool будут переданы функции write для вывода). Используется для проверок на ошибки.
include> 0 Включает в программу заданный набор файлов (компилирует их). Если расширение не указано, то предполагается "atol". В компилированном файле *.atoc сохраняются все включаемые данные. Если необходимо подключить файл без расширения, то в конце имени файла ставится точка (.) Эта функция может быть использована как в глобальной области, так и внутри функции (локально).
with2 with Префикс Действия
Выполняет заданные действия (одно действие или список в фигурных скобках), при этом, когда внутри тела функции with вызывается некоторая функция с именем ИмяФункции, то сначала будет попытка вызвать функцию Префикс.ИмяФункции, и только если такая функция будет не найдена, то будет вызвана функция ИмяФункции. (в Pascal есть схожий по действию оператор, также называемый with). Префикс может быть как атомом, так и вызажением его вычисляющим. Если внутри оператора with начать имя функции с точки (.), то префикс будет проигнорирован и будет вызвана сама фукнкция (то есть с именем без точки вначале).
Пример:
with console { color(red) var(x) goto(10 15) .writenl(error!) }
Эквивалентно:
console.color(red) var(x) console.goto(10 15) writenl(error!)
atol.initialize0 Внутренняя функция инициализации глобальных объектов и вызова кода начальной инициализации. Ручное использование ее врят ли будет полезно. Она вызывается автоматически при входе в программу.
atol.about0 Выводит на экран диалог с информацией о версии ATOL
atol.version0, 1 Возвращает версию ATOL. Если есть параметр, то версия возвращается также в него.
do0 Данную функцию не нужно вызывать, ее можно объявлять. Столько раз, сколько нужно. Суть в том, что ее тело будет вызываться в ходе инициализации программы (см. функ. atol.initialize). То есть, посредством этой функции объявляется код, который должен быть вызван еще до запуска функции main, причем в любом месте программы, в любом файле или модуле.

 
Модульность
Объявление модуля происходит посредством использования зарезервированного слова module в глобальной области, после которого идет имя модуля, а затем, в фигурных скобках, его содержимое (функции, переменные). Пример:
	module my_mod
	{
	% global variables:

		var( x y z )	% this creates three variables: my_mod.x, my_mod.y my_mod.z .


	% module's functions:

		f(arg)	% this creates function my_mod.f(arg) .
		{
			writeln('Call function (f) from module (my_mod) with args: ' arg)
		}

	}
Функцией А модуля Б считается функция вида 'Б.А'. Для быстрого обращения к набору функций модуля Б можно использовать функцию with: with Б { действия }.
 
Объекты
Объект в ATOL - тоже что и в других языках программирования. Но на данный момент поддержка объектов не реализована на достаточном уровне. На данный момент, внешняя библиотека обладает возможностью создавать глобальные объекты в программе. Объект принадлежит некоторому классу и обладает набором свойств. Его класс обладает набором методов. Использование объектов можно видеть в библиотеке atol.gui. Внутренне, метод класса - это функция от одного дополнительного первого аргумента - имени объекта. Объявлять объекты в самой программе пока что нельзя.
 
Глобальные объекты

command_line - переменная, в начале работы программы ей присваивается командная строка, с помощью которой была вызвана текущая программа (так как это переменная, то ее значение, в случае надобности, можно изменять).
 
Поддержка внешних библиотек
ATOL поддерживает внешние библиотки (DLL). Такая библиотека должна иметь функцию char ** WINAPI atol_lib_install(ATOL_INTERFACE IAtol), которая бы возвращала список экспортируемых функций, состоящий из пар: имя экспортируемой функции; название этой функции в библиотеке. Также библиотека должна подключать файл atol_interface.h, в котором определен интерфейс к ATOL для внешних библиотек. Адрес этого интерфейса передается всем вызываемым из библиотеки функциям. Экспортируемая функция должна иметь следующий формат:
	ATOL_ATOM WINAPI Name(ATOL_INTERFACE IAtol, ATOL_LIST Args, ATOL_LIST Params);

	IATol    = указатель на интерфейс.
	Args     = значения переданных параметров (список).
	Params   = имена переданных параметров (список), то есть конкретные имена переменных,
	           которые были переданы функции, или же имена функций, или неполсредственных атомов.
	           Другими словами, имя фактического параметра. Используется для возвращения значения
	           через параметр (используя соответствующую функцию интерфейса IAtol
	           для установки значения переменной).

	Функция должна возвратить значение - атом.
*IAtol - это структура, содержащая адреса функций для доступа к различным возможностям ATOL, в том числе там содержатся функции, для работы со списком аргументов, функции для работы с атомами.
Для более подробной информации о внешних библиотеках - смотри пример, который идет в комплекте с системой.

 
© 2005, Alexander G. Karpov a.k.a. mrhx.
http://mrhx.narod.ru