Joy (язык программирования) (Joy (x[dt hjkijgbbnjkfgunx))

Перейти к навигации Перейти к поиску
Joy
Класс языка мультипарадигменный: функциональный, конкатенативный, стековый
Появился в 2001
Автор Manfred von Thun
Разработчик Manfred von Thun, John Cowan
Система типов сильная, динамическая
Основные реализации Joy0, Joy1, "Current Joy", "John Cowan's Joy", "JoyJ (Joy in jvmm)"
Испытал влияние Scheme, C
Повлиял на Factor, Cat, V, Trith

Язык программирования Joy — чисто функциональный язык разработанный Manfred von Thun из Университета Ла Троба в Мельбурне, Австралия. Joy базируется на композиции функций, а не на лямбда-исчислении. Это язык, родственный Форту, хотя и не является его прямым наследником. В настоящее время Joy считается каноническим примером языка конкатенативного программирования.[1]

Как это работает?

[править | править код]

Joy отличается от других языков программирования (за исключением языков комбинаторного программирования и некоторых эзотерических, таких, как unlambda) отсутствие лямбда оператора, и, следовательно, отсутствие формальных параметров. Чтобы проиллюстрировать это приведём пример, как функция возведения в квадрат может быть определена в языке императивного программирования (C):

 int square(int x) {
   return x*x;
 }

Переменная х является формальным параметром, заменяемым на фактическое значение, которое необходимо возвести в квадрат, при вызове функции. В функциональном языке (Scheme) та же функция определяется следующим образом:

(define square
  (lambda (x) 
    (* x x)))

Между этими двумя примерами много различий, но они используют формальные параметры сходным образом. В Joy же функция возведения в квадрат определяется как:

DEFINE square == dup * .

Всё в Joy, является функциями, принимающими стек как аргумент, и возвращающими стек в качестве результата. К примеру, цифра «5» является не целой константой, а короткой программой, помещающей число 5 на стек.

  • Оператора dup просто дублирует верхний элемент в стеке, помещая туда его копию.
  • Оператор * берёт со стека два верхних элемента и помещает туда их произведение.

Таким образом функция возведения в квадрат просто дублирует верхний элемент, а затем перемножает его на самого себя, формальные параметры не нужны. Это делает Joy лаконичным, о чём свидетельствует следующее определение быстрой сортировки:

 DEFINE qsort ==
   [small]
   []
   [uncons [>] split]
   [[swap] dip cons concat]
   binrec .

«binrec» — один из многих существующих в Joy рекурсивных комбинаторов, реализующий бинарную рекурсию. Он ожидает наличие на стеке четырёх программных литералов, которые представляют собой:

  • условие прекращения (если список «мал» (1 или 0 элементов) он уже отсортирован),
  • что делать, если условие прекращения выполняется (в этом случае ничего),
  • что делать по умолчанию (разделить список на две половины путём сравнения каждого элемента с опорной точкой), и, наконец,
  • что делать в конце (вставить опорную точку между двумя отсортированными половинками).

Примечания

[править | править код]
  1. Dr. Dobbs

Литература

[править | править код]