Paradigm | Макропроцессор общего назначения |
---|---|
Разработан Авторы | Стивен М. Кейн и Э. Кент Гордон |
Впервые появились | 1968 |
Стабильный выпуск | 1.0 |
Лицензия | MIT |
Основные реализации | |
Unidata TTM | |
Под влиянием | |
GAP, GPM, TRAC |
TTM - это строковый язык программирования общего назначения разработан в 1968 году Стивеном Кейном и Э. Кентом Гордоном в Калифорнийском технологическом институте.
Следующее описание взято из оригинального TTM справочное руководство и последующее расширение пакетной обработки.
TTM - это рекурсивный интерпретирующий язык, разработанный в первую очередь для обработки строк, редактирования текста, определения и расширения макросов и других приложений, обычно классифицируемых как системное программирование. Он является производным, прежде всего, от GAP и GPM.
Первоначально TTM планировалась как часть обработки макросов ассемблера для IBM System / 360 и, как таковая, была разработана для преодоления ограничений и несоответствий, которые существовала в стандартных ассемблерах для этой системы.
Кроме того, он был разработан, чтобы иметь всю мощь, которой обладали более ранние общие макроассемблеры, но с устранением прискорбных синтаксических и семантических трудностей.
В течение С развитием TTM стало очевидно, что возможны и другие приложения, кроме обработки макросов на ассемблере. К ним относятся редактирование данных, манипуляции с текстом, компиляция выражений и обработка макросов для языковых процессоров, отличных от ассемблеров.
Первоначальная версия TTM была реализована для работы в диалоговом режиме в базовой системе разделения времени Caltech для IBM System / 360 Model 50. Другие версии были написаны для работы в среде пакетной обработки OS / 360 и для работы перед процессорами различных языков или совместно с ними.
Эталонная реализация предполагает, что TTM задан текстовый файл, содержащий некоторую комбинацию обычного текста и вызовов функций TTM (то есть вызовов). Текст сканируется посимвольно. Любой обычный текст передается на вывод без изменений (за исключением экранирования). Если встречается функция TTM, она собирается и выполняется.
Общая форма вызова функции TTM выглядит так:
#
, где имя функции и аргументы представляют собой произвольные символьные строки, не содержащие значимых символов: '#', '<', '>' и '; '. Функция вызывается с указанными аргументами, и полученный текст вставляется в исходный текст вместо вызова функции. Если перед вызовом функции стоит один символ «#», сканирование возобновится непосредственно перед вставленным текстом из вызова функции.
Это называется активным вызовом.
Если перед вызовом функции стояли два символа '#', сканирование возобновляется сразу после вставленного текста. Это называется пассивным обращением.
Во время сбора вызова функции могут встречаться дополнительные вызовы функции, например, this.
#;...;argn>
Вызов вложенной функции будет вызван при обнаружении, и результат будет вставлен в текст вызова внешней функции, и сканирование вызова внешней функции возобновится в месте, обозначенном количество символов "#" перед вложенным вызовом.
Если функция принимает, например, 2 аргумента, любые дополнительные параметры игнорируются. Для пользовательских функций, если предоставлено слишком мало аргументов, добавляется дополнительный со значением пустой строки (""). Функция может иметь максимум 62 аргумента.
Как и в случае других прикладных языков программирования, функция TTM может быть рекурсивной и может быть определена как результат вызова последовательности других вызовов функций.
Функции могут быть встроенными или определяемыми пользователем. Существует большое количество встроенных функций, которые описаны в справочном руководстве TTM
Пользовательские функции создаются с использованием следующих двух встроенных функций.
Первая функция, ds для "определения строки", определяет именованную строку в словаре TTM. Имя - «имя», а его значение - «текст». Вызов этой именованной строки приведет к тому, что ее вызов будет заменен значением (то есть «текстом»).
Вторая функция, ss для «строки сегмента», просматривает текст ранее определенной строки в поисках вхождений ее аргументов: text1, text2,... textn. Когда вхождение обнаруживается, оно заменяется меткой сегмента. Все вхождения каждого аргумента заменяются одной и той же меткой сегмента.
Когда вызывается сегментированная строка, каждый аргумент вызова заменяется соответствующей меткой сегмента. Рассмотрим этот пример.
[01] #[02] # [03] #
Строка F определена (строка 1), и ее тело «abcxxdefyy» сегментировано на две строки «xx». "и" гг "(строка 2). При вызове (строка 3) он вернет значение «abc11def22». Фактически у нас есть определяемая пользователем функция F с двумя аргументами.
Можно экранировать один или несколько символов, используя любое из двух соглашений.
Если строка заключена в <...>, то она сканируется, но не интерпретируется TTM. В процессе сканирования внешние скобки < and>удаляются. Если есть вложенные вхождения <...>, они сканируются, но < and>не удаляются. Скобки должны быть сбалансированы: количество символов «<' characters must equal the number of '>».
Соглашение об экранировании '@' заставляет интерпретатор передавать как есть символ после '@'. Ведущий '@' остается, если он находится в escape-последовательности <...>, в противном случае он удаляется. Одно из применений - разрешить несбалансированное вхождение символов «<' or '>».
Самый простой пример включает определение функции, которая полезна для определения дополнительных функций. Эта "мета" функция называется def. Он записывается как:
#>; ## >>#
Мы можем, например, использовать def, чтобы определить строку XX как 12345, а затем сегмент XX на 34, написав это.
#
Вызов
#
затем выдаст строку «1200005».
Функция def работает путем вызова ds для определения имени функции и начального текста в словаре TTM - XX в нашем примере.
Затем текст словарной статьи XX сегментируется по любым указанным аргументам: в данном случае «34».
Когда вызывается XX, его аргумент заменяется меткой сегмента.
Функция факториала может быть определена (используя приведенную выше функцию ##
#>>>>>>
Обратите внимание, что внутреннее вычисление (# Пример вызова будет выглядеть так. и вернет строку 6. Точная связь между TTM и TRAC неизвестна. В документации TTM указано, что она была получена из GAP и GPM. В любом случае описание характеристик TRAC также применимо к TTM. Однако, если убрать синтаксическое различие между встроенной и определяемой пользователем функцией, TTM станет гораздо более чистым языком.#