Interpreter in program Demagog

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

Это - известный скриптовый язык программирования Lua, с дополнительными функциями, частью написанными на самом Lua, частью импортированными из проекта Demagog. Здесь даны лишь минимально необходимые сведения. Подробнее см. Роберту Иерузалимски "Программирование на языке Lua", книгу в электронном виде можно найти в Интернете.
 
1. ОСНОВНЫЕ ОПРЕДЕЛЕНИЯ
Красным цветом указаны не обязательные элементы
   
-- все, что после этих знаков - комментарий
; разделитель операторов в строке (не обязателен)
'строка символов'
"строка символов"
строковая константа; может содержать экранированные последовательности: \a звонок, \b backspace, \f перевод страницы, \r возврат каретки, \n перевод строки, \v \t верт. и гор. табуляция, \\ обратный слэш, \' апостроф, \" двойная кавычка, \ddd десятичный код символа (d означает десятичную цифру), \xhh 16-ричный код символа (h означает 16-ичную цифру)
[[строка символов]] строковая константа; все символы воспринимаются как они есть
nil значение переменной, для которой не было операций присваивания
переменная = выражение присваивание
   
if логическое_выражение then
  ...
elseif
  ...
else
  ...
end
условный оператор
   
for i = min, max, step do
  ...
end
оператор цикла
break оператор выхода из цикла до его завершения; например:
for i = 1, #a do
  ...
  if (a[i] < 0) and (i > 10) then break end
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; например string.find('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
ValidFileName(fname) возвращает true, если имя файла не содержит недопустимх символов, и false в противном случае
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
SplitFileName(f) принимает имя файла и возвращает список из трех строк: путь, краткое имя без пути и расширения, расширение; например: SplitFileName( [[d:\qwerty\йцукен.1.txt]] ) ==> { [[d:\qwerty\]], [[йцукен.1]], [[.txt]] }
Fragments(s, fragsize, parag) разделяет текст на фрагменты с заданным количеством символов; parag = true - фрагменты собираются из абзацев, иначе - из предложений
WSeries(i, folder, fragsize, parag, header, ender, startnum) создает сериал из документа, загруженного во вкладку i; folder - папка назначения; fragsize - размер серии в символах; parag = true - набор фрагментов по абзацам, false - по предложениям; по умолчанию false; header - заголовочная фраза серии, в которой должен содержаться маркер вставки номера %d; ender - последняя фраза серии, в которой должен содержаться маркер вставки номера %d; startnum - начальный номер серии, по умолчанию 1 
FilterToAll(folder, mask, diclist) применяет к файлам в папке folder, имена которых отвечают маске mask, словари, перечисленные в списке diclist; возвращает 2 значения: количество обработанных файлов и количество примененных словарей. Список словарей задается в виде 2-мерной таблицы: diclist = { {'словарь1', mode'}, {'словарь2', mode}, ... {'словарьN', mode} }; mode = true, если dic-словарь применяется по быстрому алгоритму и false, если прямым перебором. По умолчанию: true. Допускается упрощенная запись списка словарей: diclist = {'словарь1', ... {'словарьX'}, ... } - т.е. в фигурные скобки заключается только имя dic-словаря, применяемого прямым перебором
AudioToAll(folder, mask, remsource) записывает аудио для всех файлов в папке folder, отвечающих маске mask; если remsource = true, то исходные текстовые файлы будут удалены
FilterAndAudioToAll(folder, mask, diclist, remsource) применяет словари из списка diclist ко всем файлам в папке folder, отвечающим маске mask; и записывает для них аудио. Если remsource = true, то исходные текстовые файлы удаляются.
IgnoreDicPan() отменяет реакцию функций WAudio, CSpeak, StrSpeak на словари, активированные в Панели словарей.  Один раз запущенная, действует до окончания скрипта.
   
2.5. Функции проекта Demagog, доступ к которым открыт интерпретатору Lua  
   
2.5.1. Функции работы с текстом:  
   
StrMatch(s, mask) true или false в зависимости от того, найдено ли совпадение со строкой s по маске mask или набору масок, разделенных символом |, например: s = 'британские ученые сделали открытие'; StrMatch(s,'британск*|учен*') ==> true
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, editmode) делает активной вкладку i (i от 1 до 16)  и возвращает номер предыдущей активной вкладки, например: WActive(7); i = 0 - то же самое, что i = 16; WActive() просто возвращает номер текущей активной вкладки; editmode - по умолчанию true - доступно редактирование текста во вкладке, false - вкладка только для чтения
WName(i) имя файла, открытого во вкладке i; если текст во вкладе еще не сохранен, то возвращает пустую строку; если во вкладке не было ни открытия файла, ни ввода текста, то возвращает false
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 не указана, то подразумевается пробел; если j = -1, то к тексту во вкладке i просто добавляется строка delim
WLog(s) добавляет во вкладку Статистики строку s или пустую строку, если параметр не указан
WSave(i, filename) сохранить текст во вкладке i в файл с именем filename; WSave(i) сохраняет текст во вкладке i под прежним именем файла; если текст еще ни разу не был сохранен, то файл создается под "временным" именем
WFilter(i, j, dicname, mode) во вкладке i выполняет замены по словарю из файла dicname, результат помещает во вкладку j; для dic-словарей применяется быстрый алгоритм или алгоритм прямого перебора - смотря что указано в Настройках программы, если не задан параметр mode; иначе: mode=true - быстрый алгоритм, mode=false - прямой перебор
   
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'
AllFolders(folder, mask) то же самое, что AllFiles(), но возвращает список имен папок, содержащихся в заданной
   
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, ind) отображает окно меню с заголовком caption, пункты которого заданы в списке items; ind - номер выделенного пункта, по умолчанию 1. Возвращает номер выбранного пункта меню или 0, если отказ от выбора. Например, показать все файлы в заданной папке: Menu('Все словари',AllFiles(HomeFolder('dic'),'.*'))
Folders(caption, initdir, cancreatedir) отображает меню выбора папки с заголовком caption; если задано initdir, то эта папка будет показана выделенной; cancreatedir = true для показа кнопки создания новой папки; возвращает строку - полное имя выбранной папки или false, если отказ от выбора
GaugeInit(max) инициализирует индикатор "бегущая строка", задавая диапазон от 0 до max
Gauge(i) отображает индикатор "бегущая строка" при изменении i от 0 до max
ShutdownDialog(ind) отображает запрос о возможности выключения компьютера; ind = 1 или 2 - номер выделенного пункта, по умолчанию 1. Возвращает true или false, в завистмости от ответа пользователя. Пример: a = ShutdownDialog(); ... if a then os.execute('shutdown /s') end
Sound() короткий звуковой сигнал
   
2.5.4. Функции чтения вслух и записи аудио:  
   
CSpeak() читает вслух текст из буфера обмена
StrSpeak(s) читает вслух строку s
WAuduo(i, targetdir, splitmode) записывает в аудио-файл текст во вкладке i; возвращает true или false, в зависимости от того, подтвердил ли пользователь папку назначения для аудио или отказался; targetdir - принудительно задает папку назначения, отменяя ее запрос, прописанный в Настройках; targetdir = '' означает запись аудио в ту же папку, где находится исходный текст; splitmode = true/false - принудительно задает деление/не деление файла на серии, невзирая на прописанное в Настройках
   


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