====== Язык программирования 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