http://mutnosoft.ru/d/textfuck.rar
Основа языка - строки и односимвольные функции.
Инструкция состоит из 1 символа (оператора), аргументов - строк, перечисленных через запятую, и точки с запятой в конце.
Переменные тоже строки. За основу для строк взят делфовский AnsiString - динамические строки неограниченной длины.
Интерпретатор работает в том числе и из командной строки. Справка в исходном коде:
CODE
//интерпретатор нехитрого языка
//язык состоит из односимвольных операторов, и текстовых параметров через ''
//все остальные символы игнорируются
//запись: # '','', ... ,'';
// 'abc''def' означает строку abc'def
//если оператор требует несколько входных значений, они записываются через ,
//точка с запятой финализирует запись
//операторы являются по сути функциями, и их результат такой же текстовый
//строки в аргументе конкатенируются при последовательной записи
//можно указывать голый текст и вызов функций
//пример записи вложенного вызова: # 'abc',(# 'fff','321','333';);
//скобки изначально игнорируются интерпретатором и служат для наглядности
//операторы можно перегружать на вызов функции с определенным именем
//перегрузить можно любой из 256 символов
//@ - символ разметки функций в модуле
// # func, ? , ... , ? ; - вызов функции func , далее идут аргументы
// = var, value; - присвоение переменной var значения value (результат = value)
//(все переменные текстовые) (если переменной нет, она создается)
//извлечение из ? номера перем. - цифры означает обращение к аргументу функции
//нумерация аргументов - с нуля, результат сохраняется в нулевой
//единственный способ записать результат: =,result; - первый аргумент пустой
// = var; - уничтожение переменной (либо ничего, если ее нет)
// =; - очистка локальных переменных функции
// при вызове функции число переменных сохраняется, все переменные, что были
// созданы под номерами выше этого числа, уничтожаются
// самоочистки не происходит!
// = var, value, ; - создать переменную даже если такая уже существует
// \ text; - вывод на экран текста text
// ^; - получить результат ввода
// ? var; - извлечение значения переменной var
// ?; - извлечь код текущей функции
// ?'0'; ?'1'; и т.д. - извлечь аргумент функции (возвр. пуст.стр. если его нет)
// ?'-1'; - извлечь количество аргументов функции (любое отрицательное число)
// ? func,(); - извлечь код функции
// ! op,func; - переопределить op[1] на функцию func (возвращает бывшую функцию)
// ! op; - обнулить переопределение (возвращает бывшую функцию)
// $ name; - загрузить функции модуля name и выполнить его код, если он есть
// в модуле сначала идет код, потом @funcname1; @funcname2; и т.д. (разметка)
// ~ func, code; - создать или перезаписать код функции
// ~ func; - уничтожение функции (либо ничего, если ее нет)
// | code; - запускает код, указанный в code
// | str, code; - если строка не пустая, запускает code
// | str1, str2, code; - если str1 равно str2, запускается code
// | str1, str2, code, else; - то же самое, но else запускается если не равны
// _; - ничего не делает
// _ str; - если строка не пустая, прерывает функцию
// _ str1, str2; - если строки равны, прерывает функцию
// _ str1, str2, ; - если строки не равны, прерывает функцию
// /; - возвращает перевод строки
// / num; - возвращает символ с кодом num (по модулю 256)
// / str,count; - возвращает str, повторяющийся count раз
// / str,pos,char; - возвращает str, в котором символ pos заменен на char
// : symb; - возвращает код символа
// : sub, str; - возвращает позицию подстроки в строке (0 если нет)
// * o, args, ... , args; - тут будут системные функции
// & o, args, ... , args; - тут будут вещественные функции
// . str; - возвращает длину строки
// . str,pos; - возвращает символ с номером pos (нумерация с единицы)
// . str,pos,len; - возвращает подстроку начиная с pos длины len
// 0; 1; ... 9; - извлечь значение строковых "регистров"
// 0,value; 1,value; ... 9,value; - изменить значение строковых "регистров"
// > cond, str, code; - цикл с предусловием:
// пока (результат выполнения cond) не равен (str), выполнять code
// < cond, str, code; - цикл с послеусловием:
// выполнять code, если (результат выполнения cond) = (str), выйти
// не использованы: [, ], +, -
// целочисленные (работают через 64bit signed):
// % a,'+',b; - сложение
// % a,'-',b; - вычитание
// % a,'*',b; - умножение
// % a,'/',b; - целочисленное деление
// % a,'%',b; - остаток от деления
// % a,'&',b; - логическое и
// % a,'|',b; - логическое или
// % a,'^',b; - исключающее или
// % a,'\',b; - исключающее или (синоним)
// % a,'>>',b; - битовый сдвиг вправо
// % a,'<<',b; - битовый сдвиг влево
// % a,'>',b; - проверка (если больше, то возвращает '1', иначе '0')
// % a,'>=',b;
// % a,'<',b;
// % a,'<=',b;
// % a,'<>',b;
// % a,'><',b;