TIPI — входной язык на основе Форта и Бейсика

Статью про TIPI, написанную разработчиком Кентом Питерсаном, можно найти в англоязычном журнале «The HP Palmtop Paper», №1, 1995 (стр. 43-48):
http://www.hpmuseum.net/pdf/TheHPPalmtopPaper_V4N1_60pgs_Jan-Feb95_OCR.pdf

TIPI — английская аббревиатура от «интерпретатор, исполняющий шитые команды» (Threaded Instruction Processing Interpreter). TIPI — структурный язык программирования с постфиксной нотацией. Плавучки в нём нет, зато есть отдельный стек для строк. Интерпретатор работал под MS-DOS. Позже в транслятор была добавлена возможность создавать независимые исполняемые файлы (EXE).

Основой TIPI стали расширяемость Форта и понятность позднего Бейсика (без номеров строк). Также Кент упоминает какие-то заимствования из ассемблера, а команда PARSE$ взята из AWK. С самого начала задачей было создать небольшой, но эффективный язык для наладонника, «с нуля».

Автор языка использовал TIPI на двух КПК — Atari Portfolio и HP 100LX, работающих под DIP DOS 2.11 и MS-DOS 5.0 соответственно. TIPI распространялся условно-бесплатно (shareware) с осени 1993 года и не стал коммерчески успешным. В те годы было несколько таких «самодельных» языков для КПК, мало что выжило. Сейчас TIPI можно разыскать в архивах Garbo / Simtel.

Следующий исходный код, демонстрирующий язык, был восстановлен мною из журнала по ссылке выше. Мне пришлось исправить несколько мелких ошибок, допущенных при публикации, и ещё больше при распознавании (OCR). Тем не менее я просто сверялся с журналом и не проверял результат на трансляторе, так что часть багов могла остаться незамеченной.

#DEMO.TPI by Kent Peterson 11/17/94

define hex$ ( n -- )
            (   -- h$ )
# Returns hex equivalent of a number.
 "" begin
     dup 16 mod
     "0123456789ABCDEF" 1 + 1 mid$
     swap$ +$
     16 / dup not
    until drop
enddef

define showtime ( -- )
                ( -- )
# Shows the current time
# on the top row of the screen.
 0 5 locate
 time$ print$
enddef

define spaces ( -- )
              ( -- )
# Print$ four spaces.
 "    " print$
enddef

define asciiline ( c -- )
                 (   -- )
# Displays c as a character,
# its hex code and its decimal code.
 dup chr$ print$ spaces
 dup hex$ print$ spaces
          print  spaces
enddef

define  wait_for_key ( -- c )
                     ( --   )
# Waits until a key is pressed
# and then returns the keycode.
# While it's waiting it shows
# the current time.
 begin
  showtime
  key dup
  if dup endif
 until
enddef

#dow let's put all this stuff together.
cls
# Displays the column headings
# and the instructions.
|
|   Char Hex   Dec
|   ==============
|
|
|
|  Press any key to see its code.
|  [ESC] exits.

0 cursor # Hide the cursor.

# This is the main loop. It will
# loop until the user presses
# the [ESC] key.
begin
 wait_for_key
 5 3 locate
 dup asciiline
 27 =
until

1  cursor  #  Set the cursor back to normal.