]]> ]]>

Online Cat 1.3

Версия реализации Online Cat языка программирования Cat

Последняя (на апрель 2011) версия интерпретатора Online Cat.

Примеры:

Hello, World! - Cat (331):

Первая строка программы добавляет строку “Hello, World!” в стек, вторая — выводит верхний элемент стека на печать. Команды языка не обязательно писать в отдельных строках; эту же программу можно было бы написать как "Hello, World!" writeln.

"Hello, World!"
writeln

Числа Фибоначчи - Cat (332):

В этом примере используется рекурсивное определение чисел Фибоначчи. Прежде всего определяется функция fib, работающая следующим образом.

При вызове функции верхний элемент стека N — номер числа, которое нужно вычислить (это единственный способ передать аргумент в функцию в Cat). Последовательность команд dup 1 <= копирует верхний элемент, сравнивает его с 1 и добавляет в стек true, если он меньше или равен 1, и false в противном случае. Затем следует условное выражение: в стек добавляются две последовательности команд (выделенные в блоки [...]), и если третий сверху элемент стека — true, выполняется первая из них, иначе — вторая. В данном случае последовательность для true пуста (Fib(0)=0, Fib(1)=1, и вычисления не нужны), последовательность для false следующая. Скопировать верхний элемент стека (это снова N), уменьшить его на 1, вызвать функцию fib для N-1, которая заменит N-1 на Fib(N-1). Затем поменять местами два верхних элемента стека (Fib(N-1) N), уменьшить верхний элемент на 2 и вызвать функцию fib, которая заменит его на Fib(N-2). Наконец, два верхних элемента стека суммируются, чтобы получить искомое Fib(N).

Вторая часть программы — цикл while по индексам от 1 до 16, который вычисляет числа и выводит их на печать. Тело цикла [dup fib write ", " write inc] копирует верхний элемент стека, вычисляет соответствующее число Фибоначчи, печатает его и запятую после него и увеличивает счетчик цикла. [dup 16 lteq] — условие повторения цикла: счетчик меньше или равен 16.

define fib {
    dup 1 <=
        []
        [dup 1 - fib swap 2 - fib +]
    if
}

    1
    [dup fib write ", " write inc]
    [dup 16 lteq]
while
"..." writeln

Факториал - Cat (333):

В примере используется рекурсивный метод вычисления факториала. Принцип работы программы аналогичен вычислению чисел Фибоначчи.

define fact {
    dup 1 <= 
        [pop 1]
        [dup 1 - fact *]
    if
}

    0
    [dup write "! = " write dup fact writeln inc]
    [dup 16 lteq]
while

Комментарии

]]>

blog comments powered by Disqus

]]>

Работа программистам