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

Поделись знанием:
Перейти к: навигация, поиск
Joy
Класс языка:

мультипарадигменный: функциональный, конкатенативный, стековый

Появился в:

2001

Автор:

Manfred von Thun

Система типов:

сильная, динамическая

Основные реализации:

Joy0, Joy1, "Current Joy", "John Cowan's Joy", "JoyJ (Joy in jvmm)"

Испытал влияние:

Scheme, C

Повлиял на:

Factor, Cat, V, Trith

Язык программирования Joy — чисто функциональный язык разработанный Manfred von Thun из Университета La Trobe (англ.) в Мельбурне, Австралия. 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 элементов) он уже отсортирован),
  • что делать, если условие прекращения выполняется (в этом случае ничего),
  • что делать по умолчанию (разделить список на две половины путём сравнения каждого элемента с опорной точкой), и, наконец,
  • что делать в конце (вставить опорную точку между двумя отсортированными половинками).

Математическая чистота

Напишите отзыв о статье "Joy (язык программирования)"

Примечания

  1. Dr. Dobbs

Литература

  • Freneger, Paul (August 2003). «[portal.acm.org/citation.cfm?id=944579.944583 The JOY of forth]». ACM SIGPLAN Notices 38 (8).
  • (9 October 2001) «[www.complang.tuwien.ac.at/anton/euroforth/ef01/thomas01a.pdf Joy: Forth’s Functional Cousin]». Proceedings of the 17th EuroForth Conference.
  • Christopher Diggins. [www.drdobbs.com/architecture-and-design/228701299 What is a Concatenative Language]. Dr. Dobbs (Dec 31, 2008). [www.webcitation.org/67eAGSILD Архивировано из первоисточника 14 мая 2012].
  • Apter, Stevan. «[www.vector.org.uk/archive/v214/joy214.htm Functional Programming in Joy and K]». Vector.

Ссылки

  • [www.latrobe.edu.au/humanities/research/research-projects/past-projects/joy-programming-language Joy homepage]
    • [www.kevinalbrecht.com/code/joy-mirror/index.html зеркало]


Отрывок, характеризующий Joy (язык программирования)

Гусар ничего не ответил.
– Что ж, ты разве не слышишь? – довольно долго подождав ответа, опять спросил Ростов.
– А кто ё знает, ваше благородие, – неохотно отвечал гусар.
– По месту должно быть неприятель? – опять повторил Ростов.
– Може он, а може, и так, – проговорил гусар, – дело ночное. Ну! шали! – крикнул он на свою лошадь, шевелившуюся под ним.
Лошадь Ростова тоже торопилась, била ногой по мерзлой земле, прислушиваясь к звукам и приглядываясь к огням. Крики голосов всё усиливались и усиливались и слились в общий гул, который могла произвести только несколько тысячная армия. Огни больше и больше распространялись, вероятно, по линии французского лагеря. Ростову уже не хотелось спать. Веселые, торжествующие крики в неприятельской армии возбудительно действовали на него: Vive l'empereur, l'empereur! [Да здравствует император, император!] уже ясно слышалось теперь Ростову.
– А недалеко, – должно быть, за ручьем? – сказал он стоявшему подле него гусару.
Гусар только вздохнул, ничего не отвечая, и прокашлялся сердито. По линии гусар послышался топот ехавшего рысью конного, и из ночного тумана вдруг выросла, представляясь громадным слоном, фигура гусарского унтер офицера.
– Ваше благородие, генералы! – сказал унтер офицер, подъезжая к Ростову.
Ростов, продолжая оглядываться на огни и крики, поехал с унтер офицером навстречу нескольким верховым, ехавшим по линии. Один был на белой лошади. Князь Багратион с князем Долгоруковым и адъютантами выехали посмотреть на странное явление огней и криков в неприятельской армии. Ростов, подъехав к Багратиону, рапортовал ему и присоединился к адъютантам, прислушиваясь к тому, что говорили генералы.
– Поверьте, – говорил князь Долгоруков, обращаясь к Багратиону, – что это больше ничего как хитрость: он отступил и в арьергарде велел зажечь огни и шуметь, чтобы обмануть нас.
– Едва ли, – сказал Багратион, – с вечера я их видел на том бугре; коли ушли, так и оттуда снялись. Г. офицер, – обратился князь Багратион к Ростову, – стоят там еще его фланкёры?
– С вечера стояли, а теперь не могу знать, ваше сиятельство. Прикажите, я съезжу с гусарами, – сказал Ростов.
Багратион остановился и, не отвечая, в тумане старался разглядеть лицо Ростова.
– А что ж, посмотрите, – сказал он, помолчав немного.
– Слушаю с.
Ростов дал шпоры лошади, окликнул унтер офицера Федченку и еще двух гусар, приказал им ехать за собою и рысью поехал под гору по направлению к продолжавшимся крикам. Ростову и жутко и весело было ехать одному с тремя гусарами туда, в эту таинственную и опасную туманную даль, где никто не был прежде его. Багратион закричал ему с горы, чтобы он не ездил дальше ручья, но Ростов сделал вид, как будто не слыхал его слов, и, не останавливаясь, ехал дальше и дальше, беспрестанно обманываясь, принимая кусты за деревья и рытвины за людей и беспрестанно объясняя свои обманы. Спустившись рысью под гору, он уже не видал ни наших, ни неприятельских огней, но громче, яснее слышал крики французов. В лощине он увидал перед собой что то вроде реки, но когда он доехал до нее, он узнал проезженную дорогу. Выехав на дорогу, он придержал лошадь в нерешительности: ехать по ней, или пересечь ее и ехать по черному полю в гору. Ехать по светлевшей в тумане дороге было безопаснее, потому что скорее можно было рассмотреть людей. «Пошел за мной», проговорил он, пересек дорогу и стал подниматься галопом на гору, к тому месту, где с вечера стоял французский пикет.
– Ваше благородие, вот он! – проговорил сзади один из гусар.
И не успел еще Ростов разглядеть что то, вдруг зачерневшееся в тумане, как блеснул огонек, щелкнул выстрел, и пуля, как будто жалуясь на что то, зажужжала высоко в тумане и вылетела из слуха. Другое ружье не выстрелило, но блеснул огонек на полке. Ростов повернул лошадь и галопом поехал назад. Еще раздались в разных промежутках четыре выстрела, и на разные тоны запели пули где то в тумане. Ростов придержал лошадь, повеселевшую так же, как он, от выстрелов, и поехал шагом. «Ну ка еще, ну ка еще!» говорил в его душе какой то веселый голос. Но выстрелов больше не было.