Interpreter in program Demagog

ВСТРОЕННЫЙ ИНТЕРПРЕТАТОР В ПРОГРАММЕ DEMAGOG

 
Это - известный скриптовый язык программирования Lua, с дополнительными функциями, частью написанными на самом Lua, частью импортированными из проекта Demagog. Здесь даны лишь минимально необходимые сведения. Подробнее см. Роберту Иерузалимски "Программирование на языке Lua", книгу в электронном виде можно найти в Интернете.
 
1. ОСНОВНЫЕ ОПРЕДЕЛЕНИЯ
(В квадратных скобках [...] указаны не обязательные элементы операторов языка)
   
-- все, что после этих знаков - комментарий
; разделитель операторов в строке (не обязателен)
'строка символов' строковая константа
nil значение переменной, для которой не было операций присваивания
переменная = выражение присваивание
   
if логическое_выражение then
  ...
[elseif]
  ...
[else]
  ...
end
условный оператор
   
for i = min, max, step do
  ...
end
оператор цикла
   
переменная = {} создать пустую таблицу с данным именем
переменная = {значение1, ... значениеN} создать таблицу с данным именем и заполнить ее значениями, индексированными целыми числами по порядку: 1 ... N;
переменная = {[индекс1]=значение1, ... [индексN]=значениеN} создать таблицу с данным именем и заполнить ее значениями по принципу: [индекс]=значение; ; индекс может быть числовым или строковым (здесь квадратные скобки - это обозначение индекса таблицы!)
имя_таблицы[индекс] = значение присвоить значение элементу таблицы
имя_таблицы[индекс] обратится по индексу к элементу таблицы, если в таблице нет запрошенного элемента, то возвращается nil; запись: имя_таблицы['строка'] эквивалентна: имя_таблицы.строка ('строка' должна содержать только латинские буквы!)
   
print(переменная1,...,переменнаяN) вывод значений переменных
put(переменная1,...,переменнаяN) следующий вывод будет в ту же строку
print() вывод пустой строки
goto label переход по метке
::label:: метка
   
Имена переменных регистрозависимы.
Имена переменных должны начинаться с буквы и могут содержать только буквы латинского алфавита, цифры и знак подчеркивания.
 
На выходе интерпретатора - результаты выполнения команд print и/или put.
   
2. ОПЕРАЦИИ И ФУНКЦИИ  
   
2.1. Математические операции:  
   
* умножение
/ деление
// целочисленное деление
^ возведение в степень
+ сложение
.. сцепление строк (конкатенация)
- вычитание
% остаток от целочисленного деления
< меньше
<= меньше или равно
> больше
>= больше или равно
~= не равно
== равно
and и
or или
   
2.2. Элементарные математические функции:
(Значок  ==> указывает на возвращаемое значение)
 
   
rad перевод градусов в радианы
deg перевод радианов в градусы
sin синус
cos косинус
tan тангенс
asin арксинус
acos арккосинус
atan арктангенс
ln натуральный логарифм
log десятичный логарифм
exp экспонента
sqrt квадратный корень
ceil округление до целого в большую сторону
floor округление до целого в меньшую сторону
round округление до заданного количества знаков; например: round(3.1415926,2) ==>3.14
   
2.3. Генераторы псевдослучайных чисел:  
   
rand(x) псевдослучайное число в диапазоне от 0 до x; например: rand(1) ==> число между 0 и 1
seed() начать генерацию новой последовательности псевдослучайных чисел; например: seed(); for i = 1, 100 do print(rand(5)) end -- каждое выполнение этой программы создаст другой список чисел
irontab(n) таблица целых псевдослучайных чисел от 1 до n; например t = irontab(1000) -- список чисел для каждого диапазона всегда один и тот же - т.н. "железная таблица" Гуго Штейнгауза
   
2.4. Функции работы со строками и текстовыми файлами:  
   
#s длина строки s; например: #'qwertу' ==> 6; так же может обозначать количество элементов в массиве
string.rep(b, n) строка, составленная из строки b, повторенной n раз; например: string.rep('*',5) ==> '*****'
string.find(s, z [,init [,plain]]) позиция по шаблону z в строке s с начальной позиции init (по умолчанию 1), если не найдено, то nil; например pos('rt','qwerty',1,true) ==> 4. Значение plain = true выключает поиск по шаблону1 и подстрока z ищется, как она есть, без учета магических2 символов
string.match (s, z [, init]) первое вхождение шаблона z в строку s; поиск с позиции init (по умолчанию 1, может быть отрицательной); в случае обнаружения, возвращает захваченные значения, иначе nil; если z не содержит захватов, то производится простое сравнение
string.sub(s, i, j) часть строки s с позиции i до позиции j; например: sub('qwerty',4,2) ==> 'rt'
string.gsub(s, sour, repl) заменяет в строке s подстроки sour на repl; например: string.gsub('qwertyQwerty','qwe','U' ) ==> UrtyQwerty 1 -- результат замены и количество замен (одна)
string.split(s, sep) "режет"  строку s по символу-разделителю sep на части и запоминает их в массиве; например: s = 'abc|123|pi=3.14'; a = string.split(s,'|'); идущие подряд разделители считаются за один
string.trim(s) удаление оконечных пробелов в строке s
string.lower(s) перевод строки s в нижний регистр
string.upper(s) перевод строки s в верхний регистр
filesize(f) размер в байтах файла с именем f
FileExists(f) существует ли файл с именем f; возвращает true или false
SaveToFile(list, f) записать список строк list в файл f; строки в файле разделяются символами '\r\n'; например, записать одну строку initdir: SaveToFile({initdir},'@.libr')
LoadFromFile(f [,allformats]) прочесть ansi-файл, состоящий из строк, разделенных символами '\r\n' в список ansi-строк; например: initdir = LoadFromFile('@.libr')[1]; если второй параметр задан true, то читается и преобразуется в ansi-строки файл любого поддерживаемого в Demagog формата, допустимые кодировки: ansi, unicode, unicode-be, utf-8; например: t = LoadFromFile('123.docx',true)
Body(w) удаление из слова w всех знаков препинания: например: s = '({["Громовержец!?.."]})'; Body(s) ==> 'Громовержец'
Similar(w1,w2,k) степень сходства слов w1 и w2, определяемая по совпадению 1, 2, .. k-буквенных последовательностей в обеих словах; по умолчанию k = 3; например: Similar('колесо','окосел') ==> 0.4666...; Similar('лес','лес') ==> 1; Similar('лес','роща') ==> 0
   
2.5. Функции проекта Demagog, доступ к которым открыт интерпретатору Lua  
   
2.5.1. Функции работы с текстом:  
   
StrMatch(s, mask) true или false в зависимости от того, найдено ли совпадение со строкой s по маске mask или набору масок, разделенных символом |, например: s = 'британские ученые сделали открытие'; StrMatch(s,'британск*|учен*') ==> true
Search(p, s[, startpos]) поиск по dic-шаблону p в строке s с позиции startpos (по умолчанию 1); возвращает: позицию с которой найдено совпадение и длину совпадающего фрагмента; например: pos, len = Search('все * *ло','Ух! Все вокруг потемнело',1) ==> 5 20
Clipboard(s) поместить в буфер обмена содержимое строки s и возвратить предыдущее текстовое содержание буфера обмена; примеры: s = Clipboard(); sold = Clipboard(snew); s = Clipboard('')
WText(i) возвращает ansi-строку, содержащую текст из вкладки i
WSel(i[, pos[, len]]) выделяет фрагмент текста во вкладке i с позиции pos длиной len; WSel(i, pos) устанавливает текстовый курсор в позицию pos - в обоих случаях возвращает итоговую позицию курсора; WSel(i) просто возвращает текущую позицию курсора
WClearSel(i) погасить выделение текста во вкладке i - то же самое, что WSel(i, WSel(i), 0)
WSelText(i, z) заменяет выделенный текст во вкладке i содержимым строки z; WText(i) возвращает выделенный текст из вкладки i в виде Ansi-строки
WActive(i) делает активной вкладку i (i от 1 до 16)  и возвращает номер предыдущей активной вкладки, например: WActive(7); i = 0 - то же самое, что i = 16; WActive() просто возвращает номер текущей активной вкладки
WNew(i[, newtext]) загружает во вкладку i текст из строки newtext (если не указана, то подразумевается пустая строка), прежний текст уничтожается; например: WNew(0, 'Лог-файл')
WOpen(i, filename) загружает во вкладку i текст из файла filename
WAdd(i, j[, delim]) добавляет к тексту во вкладке i текст из вкладки j, используя строку-разделитель delim; например: delim = '\r\n\r\n'; WAdd(1, 9, delim); при этом тексты разделятся пустой строкой; если delim не указана, то подразумевается пробел
WFilter(i, j; dicname) во вкладке i выполняет замены по словарю из файла dicname, результат помещает во вкладку j
   
   
2.5.2. Специальные функции:  
   
HomeFolder(f) имя папки f в рабочем каталоге Demagog'a с добавлением полного пути; например, HomeFolder('dic') ==> что-то вроде этого: 'D:\0 - Unicode\Demagog-U\dic\' (в зависимости от того, где находится Demagog на вашем компьютере); HomeFolder() ==> полное имя рабочей папки Demagog'a
CurrentLang() текущий язык интерфейса; возможные значения: 'English', 'Esperanto', 'Russian', 'Spanish', 'Ukrainian'
AllFiles(folder, mask) массив строк - имен файлов в папке folder, имена которых отвечают маске mask; например: AllFiles('D:\Demagog\dic','*.rex'); если маска начинается с символа '.', то подразумевается '*.'; например '.txt' соответствует '*.txt'
   
2.5.3. Функции сообщений и диалога:  
   
ShowMessage(s) выводит на экран сообщение s; например: ShowMessage('Расчет закончен')
MessageDialog(s) выводит на экран вопрос s, возвращает true, если "да" и false, если "нет"; например: answer = MessageDlg('Начать расчет?')
OpenDialog([multiselect]) отображает диалог открытия файла; возвращает полное имя выбранного файла, если multiselect = false или не указано; или массив строк из полных имен выбранных файлов, если multiselect = true; в случае отказа от выбора возвращает nil
Input(title, prompt) отображает окно ввода данных с заголовком title и названиями вводимых величин, перечисленными в массиве promp; например: coff = Input('Решить квадратное уравнение',{'A=1','B','C'}); значения по умолчанию, если есть, отделяются символом "="; возвращает  массив строк; в случае отказа от выбора возвращает nil
Menu(caption, items) отображает окно меню с заголовком caption, пункты которого заданы в массиве items; возвращает номер выбранного пункта меню или 0, если отказ от выбора; например, показать все файлы в заданной папке: Menu('Все словари',AllFiles(HomeFolder('dic'),'.*'))
Folders(caption[, initdir[, cancreatedir]]) отображает меню выбора папки с заголовком caption; если задано initdir, то эта папка будет показана выделенной; cancreatedir = true для показа кнопки создания новой папки; возвращает строку - полное имя выбранной папки или false, если отказ от выбора
GaugeInit(min, max) инициализирует индикатор "бегущая строка",
Gauge(i) отображает индикатор "бегущая строка" при изменении i от min до max
   
2.5.4. Функции чтения вслух и записи аудио:  
   
CSpeak() читает вслух текст из буфера обмена
StrSpeak(s) читает вслух строку s
WSpeak(i) читает вслух текст во вкладке i
WAuduo(i) записывает в аудио-файл текст во вкладке i
   


   
1 Основные шаблоны поиска: . все символы; %a буквы; управляющие символы; %d цифры; %g печатаемые символы, кроме пробельных; %l строчные буквы; %p символы пунктуации; %s пробельные символы; %u заглавные буквы; %w буквенно-цифровые символы; %x шестнадцатеричные.
  Любая из этих букв в верхнем регистре означает дополнение класса, т.е. множество не входящих в него символов. Пример: %A все небуквенные символы.
  %bxy сбалансированная строка, ограниченная слева символом "x" и справа символом "y", например: %b()
  %f[множество_символов] пограничный образец, соответствует пустой строке, только если следующий символ входит в указанное множество, а предыдущий - нет.
2 Магические символы: ( ) захват по образцу; . любой символ; % экранирующий для магических символов; + одно или более повторений; * ноль или более повторений; - 0 или более коротких повторений; ? 0 или 1 вхождение; [ ] диапазон символов; ^ начало строки (или дополнение класса, если в диапазоне символов); $ конец строки;