Cat
- Парадигма:
- Типизация:
- Реализации и версии (свернуть все | развернуть все):
Cat — функциональный стек-ориентированный язык программирования, созданный под влиянием Joy.
Cat был создан Кристофером Диггинсом (Christopher Diggins), который остается его главным разработчиком. У языка есть несколько реализаций, включая официальную, написанную на C#.
В спецификации Cat определены три уровня команд языка. level-0, или ядро Cat, — чисто функциональный язык. Следующие уровни расширяют набор доступных команд.
Все команды языка обмениваются данными через единую структуру данных — стек. Стек может содержать числа, строки, списки, функции и любые другие данные. Это привносит в язык некоторые особенности, отсутствующие в других стековых языках.
Элементы синтаксиса:
Регистрозависимость | level-0 - нет, level-1,2 - да |
---|---|
Регулярное выражение идентификатора функции | level-0 - [[_a-zA-Z][_a-zA-Z0-9]*] |
Блок | [ ... ] |
Равенство | eq |
Неравенство | neq |
Сравнение | gteq, lteq, gt_int, lt_int и т.д. для других типов |
Определение функции | define definition-name (: type-declaration)? metadata? { expression } |
Вызов функции | definition-name |
Вызов функции без параметров | definition-name |
Ссылки:
Примеры:
Hello, World!:
Пример для версий Online Cat 1.3Первая строка программы добавляет строку “Hello, World!” в стек, вторая — выводит верхний элемент стека на печать. Команды языка не обязательно писать в отдельных строках; эту же программу можно было бы написать как "Hello, World!" writeln
.
"Hello, World!"
writeln
Числа Фибоначчи:
Пример для версий Online Cat 1.3В этом примере используется рекурсивное определение чисел Фибоначчи. Прежде всего определяется функция 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
Факториал:
Пример для версий Online Cat 1.3В примере используется рекурсивный метод вычисления факториала. Принцип работы программы аналогичен вычислению чисел Фибоначчи.
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
]]>