Qi (язык программирования)
Qi (произносится «чи») — функциональный язык программирования, близкий к Common Lisp, но отличающийся от него возможностью использовать статическую типизацию (как в Haskell или C++), сопоставление с образцом и другие преимущества современных декларативных языков.
Qi написан на Лиспе и поверх него (используя его богатые возможности метапрограммирования)[1] и разрешает использовать функции базового языка[2].
Язык принципиально разрабатывается как экспериментально-образовательный, создатель языка не прилагает никаких особых усилий к его популяризации, в следствие чего уступает, к примеру, такому «новому лиспу» как Clojure[3].
Наименование и логотип[править]
Наменование Qi — это английское написание того, то известно у нас как жизненная сила Ци (气,氣). Логотип Qi в 2007 году разработал Ли Ша (англ. Xah Lee, настоящее имя Ли Шаван, 李杀网). По его собственным словам он основывался на традициях китайской каллиграфии. Лямбда окрашена в цвет тёмной киновари, традиционный цвет даосских храмов. Авторские права на логотип переданы создателю языка Qi Марку Треверу[4].
История[править]
Автор языка — Марк Тарвер, в настоящее время — профессор в отставке. Qi был создан им как часть проекта L21, цель которого — улучшение Лиспа для решения проблем 21 века. В своём докладе[5] Тарвер излагает проблемы Лиспа, которые, как он утверждает, наносят ущерб широкому распространению языка. Конкретно, он обозначает отсутствие в Common Lisp паттерн матчинга, несоответствия с теорией лямбда-исчисления и отсутствие статической типизации. Эти недостатки, по утверждению Тарвера, привели к отказу от Лиспа при обучении в университетах и, как следствие, к отсутствию Лисп-программистов.
Язык был представлен сообществу в Апреле 2005 года. Первая версия распространялась под лицензией GPL. В конце 2008 года была выпущена пересмотренная версия Qi II. Лицензия GPL была заменена двойной лицензией, позволяющей как Open Source, так и закрытое коммерческое использование[6]. Среди нововведений Qi II можно, в частности, отметить ленивое вычисление (по требованию)[7].
В августе 2009 года Марк объявил, что он прощается с программированием и уезжает в Индию заниматься йогой[8]. Однако в декабре того же года он вернулся в Англию и заявил, что «фаза путешествий закончилась».
Shen[править]
В том же году Тарвер на европейской лисп-конференции (European Conference on Lisp) представил доклад «The Next Lisp»[9]. В качестве основной проблемы языка Qi им была названа зависимость от Коммон Лиспа. Поэтому следующая версия языка, появившаяся в ноябре 2011 года, названная уже Shen (что по-китайски означает «душа») реализована уже поверх минималистиного виртуального лиспа, подобного Lisp 1.5, разработанному Джоном МакКарти. Этот минимальный лисп сначала назывался Kernel Lisp а затем получил название KLambda.
Shen был портирован на CLisp, SBCL, ECL, Scheme, Clojure, JavaScript и Java. Лицензия Shen является копилефтной и позволяет свободно использовать и модифицировать код языка, до тех пор, пока спецификация языка остаётся неизменной, не допускается распространять производные копии, которые не соответствуют стандарту Shen и/или имеют другие названия[10]. Одним из важных нововведений этого языка стало появление собственной макросистемы[11].
Ядро языка[править]
Ядро Qi — это основано на Лиспе. Для функции также используется префиксная запись. Hello World на Qi выглядит так:
(output "Hello, world~%")
Списки создаются при помощи квадратных скобок [ … ] с пробелами, разделяющими элементы.
[76 trombones]
Функция вычисления факториала с использованием сопоставления с образцом:
(define factorial 0 -> 1 N -> (* N (factorial (- N 1))))
Лямбда функция, умножающая аргумент на 2:
(/. X (* X 2))
В функциях можно использовать сопоставление с образцом для списков (Qi, в основном, следует синтаксису Эдинбургского Пролога при сопоставлении (переменные пишутся в верхнем регистре), но вместо запятых при разделении используются пробелы.):
(define member _ [] -> false X [X | _] -> true X [_ | Y] -> (member X Y))
В состав языка также включена полноценная реализация Пролога Qi Prolog, реализованная как библиотека на Qi.
В языке Shen сопоставление с образцом возможно также для строк и векторов[12].
Функция, использующая охрану при нахождении первого числа, большего чем N, в списке:
(define find_greater N [] -> (error "no number greater than ~A.~%" N) N [M | _] -> M where (> M N) N [_ | Ns] -> (find_greater N Ns))
Статическая типизация[править]
Статическая типизация необязательна и включается командой (tc +), а выключается (tc -). Система типов распознает знаки, переменные, строки, логические значения, числа и символы в качестве примитивных типов. Операторы примитивных типов: списки, *(умножение), --> и массивы.
Источники[править]
- ↑ Common Lisp как мета-язык
- ↑ Mark Tarver и Qi
- ↑ Why Qi Lisp Fails and Clojure Succeeds
- ↑ Qi Lisp Language Logo, Xah Lee, 2007-12-30
- ↑ All notes taken from Mark Tarver’s lecture 'Lisp for the 21st C.'
- ↑ Лицензия
- ↑ Вышел Qi II, linux.org.ru, 02.12.2008
- ↑ Создатель Qi сворачивает проект, linux.org.ru, 02.08.2009
- ↑ Mark Tarver The Next Lisp. Проверено 13 декабря 2012.
- ↑ Mark Tarver The Shen License. Проверено 13 декабря 2012.
- ↑ Mark Tarver Shen Macros. Проверено 13 декабря 2012.
- ↑ Mark Tarver Shen pattern matching. Проверено 13 декабря 2012.
Литература[править]
- Mark Tarver Functional Programming in Qi. — 2-nd edition. — Free University Press, 2008. — 440 p. — ISBN 1844265498, 9781844265497. (on-line version)
Ссылки[править]
- lambdassociates.org — официальный сайт «Qi (язык программирования)»
- Сайт языка Shen, наследника Qi
![]() Основные языки программирования ↑ [+] | |
---|---|
Используемые в разработке |
Ада • A+ • APL • Atlast Forth • AWL • Язык ассемблера • ActionScript • ABAP/4 • AutoIt • AWK • BeanShell • Бейсик • Си • Кобол • C++ • C# • Cω • Clarion • Clojure • ColdFusion • Common Lisp • D • dBase • Delphi • DuAL • Eiffel • Erlang • Euphoria • F# • Форт • Фортран • Gambas • Go • Groovy • HAL/S • Haskell • IBM PL/S • Icon • Iridium • Java • JavaScript • Limbo • Lua • Модула-3 • Object Pascal • Objective-C • OCaml • Oz • Parser • Паскаль • Компонентный Паскаль • Perl • Pixilang • PHP • PowerBASIC • Python • ПЛ/1 • Пролог • Qi • Ruby • Scala • Scheme • Seed7 • Smalltalk • SQL • PL/SQL • Tcl • TouchDesigner • Vala • Visual Basic (.NET) • X-Robot |
Академические | |
IEC 61131-3 |
Instruction List • ST • FBD • Ladder Diagram (LD) • SFC |
Прочие | |
Эзотерические | |
Визуальные | |
Прочее |