====== Язык программирования TRAC ====== {{trac:trac.tgz | Интерпретатор языка TRAC}}, с исходными текстами на языке Си. Лицензия [[http://www.gnu.org/licenses/gpl.html | GPL]]. Язык программирования TRAC был создан Келвином Муэрсом в начале 60-х. Ссылки: * [[http://en.wikipedia.org/wiki/TRAC_programming_language | Статья в Википедии]] * [[http://portal.acm.org/citation.cfm?doid=365230.365270| Статья Муэрса в CACM 1966]] (платный доступ) * [[http://www.cs.man.ac.uk/~pjj/projects/trac_doc | Введение в TRAC]] Джона Кована * [[http://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/edit/emacs/docs/mint2.txt | Язык MINT]] - расшифровывается как Mint Is Not Trac В данной реализации по сравнению с описанием, приведенным в книге [[http://lib.mexmat.ru/books/8510 | Ч.Уэзерелла "Этюды для программистов"]] изменена мнемоника, работа с бланками на внешних устройствах, трассировка, нет функций установки и чтения указателя, функция list по умолчанию использует разделитель ",", конец файла выступает как металитера. Интерпретатор по очереди считывает и выполняет файлы, указанные в списке параметров. Если параметров нет, считывается файл стандартного ввода. Сигнал прерывания ("^C") приводит к прерыванию выполнения текущей цепочки и выходу на основной цикл, сигнал выхода ("^\") - к немедленному выходу из программы. Синтаксис выражений языка TRAC: #( имя, пар1, ... ) - активный вызов функции (с повторным сканированием) ##( имя, пар1, ... ) - пассивный вызов функции (без повторного сканирования) ( цепочка ) - защита цепочки от выполнения ===== Встроенные функции ===== | #( add, a, b ) | арифметическое сложение | | #( and, a, b ) | логическое "и" | | #( basis, b1, b2, x ) | изменение основания | | #( call, name, arg ) | вызов бланка | | #( char, x ) | выдача символа по коду | | #( clear ) | уничтожение всех бланков | | #( code, x ) | выдача кода символа | | #( define, name, body ) | определение бланка | | #( delete, file ) | уничтожение внешних файлов | | #( div, a, b ) | арифметическое деление | | #( eq, a, b, T, F ) | сравнение строк | | #( exit ) | перейти к следующей программе | | #( find, name, line, Z) | выдача бланка name до строки line | | #( get, name, n, Z ) | выдача строки бланка длиной n литер | | #( getchar, name, Z ) | выдача символа из бланка | | #( getline, name, Z ) | выдача строки бланка до метки | | #( gt, a, b, T, F ) | сравнение строк | | #( halt ) | выход из интерпретатора | | #( input, Z ) | ввод строки до металитеры | | #( inputchar, Z ) | ввод символа | | #( length, x ) | выдача длины цепочки | | #( list, x ) | выдача списка имен всех бланков | | #( meta, x ) | установить металитеру | | #( mul, a, b ) | арифметическое умножение | | #( not, x ) | логическое дополнение | | #( notrace ) | выключение трассировки | | #( or, a, b ) | логическое "или" | | #( output, x ) | вывод строки в файл вывода | | #( print, x ) | печать бланков в файл диагностики | | #( range, name ) | выдача максимального номера метки бланка | | #( read, file, ... ) | считывание бланков из внешних файлов | | #( remove, name ) | уничтожение бланка | | #( rewind, name ) | установка указателя в начало | | #( rshift, n, x ) | циклический логический сдвиг | | #( scan, name, arg ) | сегментация бланка | | #( setin, file ) | подключение ввода | | #( setout, file ) | подключение вывода | | #( shift, n, x ) | логический сдвиг | | #( stop ) | перейти к следующему файлу | | #( sub, a, b ) | арифметическое вычитание | | #( trace ) | включение трассировки | | #( write, file, name ) | запись бланков во внешний файл | ===== Пример: вычисление факториала ===== #( define, fact, (#( eq, A, 0, 1, (##( mul, A, #( fact, ##( sub, A, 1 ) ) )) )) ) #( scan, fact, A ) #( fact, 40 ) Результат: 815915283247897734345611269596115894272000000000 ===== Пример: вычисление E ===== Вычисляем E как сумму обратных факториалов. #( define, e, (#( eq, A, 0, B, (#( e, ##( div, A, ##( add, C, 1 ) ), ##( add, A, B ), ##( add, C, 1 ) )) )) ) #( scan, e, A, B, C ) #( e, 1 #( repeat, 10, 0000000000 ) ) Результат: 27182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664238 ===== Пример: вычисление Пи ===== Вычисляем по формуле: * pi/4 = 4 arctg (1/5) - arctg (1/239) причем арктангенс раскладываем в ряд: * arctg x = x - x3/ 3 + x5/ 5 - x7/ 7 + ... ##( define, barctg.loop, (#( eq, B, 0, A, (#( barctg.loop, ##( add, A, ##( div, B, D ) ), ##( div, B, C ), C, ##( add, D, 2 ) )) )) ) ##( scan, barctg.loop, A, B, C, D ) ##( define, barctg, (#( div, #( barctg.loop, B, ##( div, B, ##( sub, , ##( mul, A, A ) ) ), ##( sub, , ##( mul, A, A ) ), 3 ), A )) ) ##( scan, barctg, A, B ) ##( define, pi, (##( mul, 4, ##( sub, ##( mul, 4, #( barctg, 5, A ) ), #( barctg, 239, A ) ) )) ) ##( scan, pi, A ) #( pi, 1 #( repeat, 10, 0000000000 ) ) Результат: 31415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170680