Что такое ATOL ?
Как это работает ?
Пошаговая инструкция по созданию программы на языке ATOL
Что такое атом ?
Символы языка
Структура программы
Описание функций
Объявление переменных
Модульность
Объекты
Глобальные объекты
Встроенные функции:Установка значения переменной (set)Поддержка внешних библиотек
Функции для работы с атомами
Функции консольного ввода/вывода
Функции условного выполнения команд
Функции сравнения
Функции для работы с логикой
Математические функции
Функции для работы со временем и датой
Функции для отладки программы
Дополнительные функции
Текущие ограничения: * Не более 63 вложенных вызовов функций в параметрах для другой функции. * Встроенная функция read не может считать больше, чем 1023 символа. * Нельзя объявлять функции вида do#* (это связано с реализацией функции do) * Отсутствие полной поддержки объектно-ориентированного программирования. * Отсутствие инструмента для замены стандартной иконки файла интерпретатора. Но Вы можете сами заменить иконку с помощью какой-либо существующей программы.Можете свободно использовать ATOL в своих целях.
my_func(param) { ... % тело функции } или: # многострочные комментарии # 'super mega function!'(arg0 arg1 arg2) { ... } или: function_with_no_args { }Функция может вернуть значение двумя способами: или с помощью встроенной функции return, или же результатом функции будет последнее вычисленное выражение.
важная_функция(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) ... } }
% 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 )
set(destination, source) % Пример: set(abc 'value for abc') set("my long long variable", "hello hello hello!!!") set(a, abc) % Присвоение значения переменной от другой переменной.
Имя функции | Число аргументов | Описание |
---|---|---|
length | 1 | Возвращает длину атома (естественно, в виде атома) |
left | 2 |
left(num atom) Возвращает num левых символов заданного атома |
right | 2 |
right(num atom) Возвращает num правых символов заданного атома |
middle | 3 |
middle(Start N Atom) Возвращает N символов заданного атома Atom, начиная с позиции Start |
concat | > 1 | Соединяет параметры в один атом и возвращает его |
append | > 2 | Соединяет параметры, начиная со второго, в один атом и записывает результат в первый параметр |
head | 1 | Возвращает первый символ атома |
tail | 1 | Возвращает аргумент, за исключением первого символа |
last | 1 | Возвращает последний символ заданного аргумента |
reverse | 1 | Перестанавливает символы в обратном порядке (abc -> cba). |
null | * | Возвращает пустой атом (''). Можно вызвать со списком параметров-переменных, которые будут обнулены. |
eol | 0, 1 |
Возвращает символ конца строки. Если вызвана с целочисленным параметром, то он определяет сколько
символов конца строк будет возвращено. Пример: write("Hello World!" eol) эквивалентно writeln("Hello World!") |
at | 2, 3 |
at(i atom) at(dest i atom) Возвращает i-ый символ атома atom. Индексация символов от нуля. Если вызывается с тремя параметрами, то в первый заносится значение функции. Пример: at(1 hello) = 'e' |
rnd | 1, 2 |
rnd(num) rnd(num symbols) Возвращает случайный атом, длиной num, созданный либо из символов второго необязательного паметра symbols, либо из символов по умолчанию - глобальная переменная rnd.symbols. Эта переменная, в начале работы программы, устанавливается в '0123456789'. Таким образом, по умолчанию, rnd будет создавать случайные целые положительные числа. |
Имя функции | Число аргументов | Описание |
---|---|---|
write | > 0 | Вывод одного или нескольких атомов в консоль |
writenl, writeln | >= 0 | Как и write вывод набора атомов, но данная функция переводит строку. |
nl | 0 | Перевод строки |
read | 0, 1 | Ввод с консоли атома. При этом, если функция вызвана от одного аргумента (имя переменной), то в него будет занесен результат ввода. Иначе, эта функция просто вернет введенное значение. |
readchar | 0, 1 | Ввод одного символа с ожиданием. Работает как и read, но без вывода на экран. |
if <условие> <действие> if <условие> <действие> else <действие иначе>Если действий несколько, то они обрамляются фигурными скобками ({}). Истинным значением условия считается непустой атом. Если атом пустой, то это значение считается ложным.
Имя функции | Число аргументов | Описание |
---|---|---|
eq | > 1 | Истина, если все атомы равны. |
eqi | > 1 | Работает как и eq, но сравнивает без учета регистра символов. |
like | 2, 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 |
eqf | > 1 |
Работает как и eq, но сравнивает попарно минимальный по длине из двух атомов с началом второго атома,
которое по длине эквивалентно минимальному. Пример: eqf(abc abcd012345) = eqf(abcd012345 abc) = true - минимальный по длине атом 'abc' и он присутствует в начале второго атома. |
Имя функции | Число аргументов | Описание |
---|---|---|
and | > 1 | Истина, если все значения истинны |
or | > 1 | Истина, если хотя бы одно значение истинно |
not | 1, 2 | Истина, если параметр ложен. Если вызывается от двух параметров, то в первый (имя переменной) заносится значение функции от второго параметра. |
var(x y z) set(x 1) set(y 5) set(z eval(eval(x + y) *10)) writeln('z = ' z) % z = 60
Пример трассировки следующей функции: make-long-line(ln i) { if not(eq(i 0)) return(make-long-line(concat(ln | i) eval(i -1))) return(ln) } Функция создает строку из чисел, разделенных символом "|", начиная с заданного в параметре 'i' числа. Вот лог трассировки вызова make-long-line(- 200): % Trace mode on % Keys: (c)ontinue or space; (s)kip; (n)otrace; (q)uit; (h)elp or ?. % Calling 'make-long-line' ... % Call: make-long-line( '-' '200' ) % Calling 'if' ... % Calling 'not' ... % Calling 'eq' ... % Extern: eq( '200' '0' ) % Exit: '' % Extern: not( '' ) % Exit: 'true' % Extern: if( 'true' '' ) % Calling 'return' ... % Calling 'make-long-line' ... % Calling 'concat' ... % Extern: concat( '-' '|' '200' ) % Exit: '-|200' % Calling 'eval' ... % Extern: eval( '200' '-1' ) % Exit: '199' % Call: make-long-line( '-|200' '199' ) % Calling 'if' ... % Calling 'not' ... % Calling 'eq' ... % Extern: eq( '199' '0' ) % Exit: '' % Extern: not( '' ) % Exit: 'true' % Extern: if( 'true' '' ) % Calling 'return' ... % Calling 'make-long-line' ... % Calling 'concat' ... % Extern: concat( '-|200' '|' '199' ) % Exit: '-|200|199' % Calling 'eval' ... % Extern: eval( '199' '-1' ) % Exit: '198' % Call: make-long-line( '-|200|199' '198' ) ... При этом, каждая строка трассировки начинается с символа однострочного комментария (%), затем отображается действие, а далее - информация о вызываемой функции или ее результат. * Calling ИмяФункции - отображается в самом начале вызова функции, еще до вычисления ее аргументов. * Call: ИмяФункции( Аргументы ) - отображается после вычисления аргументов к пользовательской функции. * Extern: ИмяФункции( Аргументы ) - отображается после вычисления аргументов к встроенной функции или функции из внешней библиотеки. * Exit: РезультатФункции - отображается после выполнения функции, показывает ее результат. Возможные клавиши во время трассировки: * h, H, ? - help. Показывает краткую подсказку по возможным клавишам. * c, C, пробел - continue. Продолжить и перейти к следующему шагу (к следующему вызову функции). * s, S - skip. Выполнить тело текущей функции без трассировки ее содержимого. * n, N - notrace. Завершить трассировку. * q, Q - quit. Выйти из программы.
Имя функции | Число аргументов | Описание |
---|---|---|
return | 0, 1 |
return(result) Возвращает результат функции, немедленно завершая выполнение функции (как в C/C++). Если вызвана без параметров, то результатом будет пустой атом (''). |
assert | > 1 |
assert(bool msg ...) Если выражение bool ложно, то останавливает работу программы и выводит сообщение об ошибке msg (все параметры после bool будут переданы функции write для вывода). Используется для проверок на ошибки. Пример: assert(eq(id 0) "Identifier is ZERO!!!" eol "Report bug: someone@mail.org") |
include | > 0 | Включает в программу заданный набор файлов (компилирует их). Если расширение не указано, то предполагается "atol". В компилированном файле *.atoc сохраняются все включаемые данные. Если необходимо подключить файл без расширения, то в конце имени файла ставится точка (.) Эта функция может быть использована как в глобальной области, так и внутри функции (локально). |
with | 2 |
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.initialize | 0 | Внутренняя функция инициализации глобальных объектов и вызова кода начальной инициализации. Ручное использование ее врят ли будет полезно. Она вызывается автоматически при входе в программу. |
atol.about | 0 | Выводит на экран диалог с информацией о версии ATOL |
atol.version | 0, 1 | Возвращает версию ATOL. Если есть параметр, то версия возвращается также в него. |
atol.number_of_atoms | 0, 1 | Возвращает число атомов в системе. Если есть параметр, то число атомов возвращается также в него. |
do | 0 | Данную функцию не нужно вызывать, ее можно объявлять. Столько раз, сколько нужно. Суть в том, что ее тело будет вызываться в ходе инициализации программы (см. функ. atol.initialize). То есть, посредством этой функции объявляется код, который должен быть вызван еще до запуска функции main, причем в любом месте программы, в любом файле или модуле. |
shell | > 1 |
Открывает заданный файл, путь или адрес. Эквивалент диалогу "Выполнить..." в меню "Пуск".
Эта функция может быть вызвана с произвольным числов параметров. Все параметры будут объединены без пробелом между ними в единую командную строку.
Пример: shell(c:\) - открывает папку "c:\". shell(http://mrhx.narod.ru) - открывает заданный адрес в интернете. shell(edit) - запускает DOSовский редактор edit. shell(ed it) - тоже запускает DOSовский редактор edit :) |
sleep | 1 |
sleep(dtime) Вызывает задержку на заданное число миллисекунд dtime. Возвращает свой аргумент. Пример: sleep(3000) - задержка на 3 секунды. |
get_tag | 1 |
get_tag(atom) Начиная с версии ATOL 1.1, каждому атому можно сопоставить целое 16-битное значение (0..65535). Эта функция возвращает это значение. По умолчанию, для каждого атома это значение 0. Можно использовать эту возможность по Вашему усмотрению. К примеру, как набор из 16-ти однобитовых флажков. |
set_tag | 2 |
set_tag(atom tag) Устанавливает 16-битное значение, ассоциируемое с заданным атомом. Возвращает заданный атом. Пример: set_tag(my_atom 0xFF) - устанавливаем для атома 'my_atom' таг 255. |
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 Б { действия }.
Пример: var(hour minute) get_time(hour minute _ _ _ _ _) writeln("SHORT TIME IS " hour : minute)
ATOL_ATOM WINAPI Name(ATOL_INTERFACE IAtol, ATOL_LIST Args, ATOL_LIST Params); IATol = указатель на интерфейс. Args = значения переданных параметров (список). Params = имена переданных параметров (список), то есть конкретные имена переменных, которые были переданы функции, или же имена функций, или неполсредственных атомов. Другими словами, имя фактического параметра. Используется для возвращения значения через параметр (используя соответствующую функцию интерфейса IAtol для установки значения переменной). Функция должна возвратить значение - атом.*IAtol - это структура, содержащая адреса функций для доступа к различным возможностям ATOL, в том числе там содержатся функции, для работы со списком аргументов, функции для работы с атомами.