LINUX.ORG.RU

[ФП][срач] Язык программирования Pure


2

4

Pure - динамически типизированный функциональный язык программирования с моделью исполнения, основанной на идее «term rewriting».

  • Синтаксис, бликий к Haskell (включая карринг, срезы, лямбды, сопоставление с образцом, list comprehensions и «as» patterns);
  • Поддерживает модель ленивости, основанную на продолжениях и заимствованную из Alice ML;
  • Допускает функции с побочными эффектами, опциональную аннотацию типов, интерфейсные типы
  • Поддержка рациональных, комплексных чисел, встроенный RegEx;
  • Содержит спектр встроенных структур данных, таких как: списки, туплы, векторы, матрицы и ленивые последовательности;
  • Интеграция с GSL;
  • Поддерживает полноценную систему гигиенических макросов;
  • Лёгкий FFI с сишными библиотеками;
  • Реализация под LLVM под GNU/Linux, Mac OS X, FreeBSD и Windows;
  • Из коробки поддержка компиляции в нативный код;
  • В комплекте идёт набор батареек для разнообразных нужд.

Про производительность заявляется следующее:

The Pure interpreter is able to achieve very good performance, offering execution speeds in the same ballpark as good Lisp interpreters. It seems to be one of the fastest implementations of term rewriting as a programming language right now, and is certainly good enough for most programming tasks except maybe the most demanding number crunching applications (and even these can be tackled by interfacing to Fortran or C).

Язык активно развивается, последняя версия документации датирована 8 января, автор постоянно пилит своё детище, активно идёт на контакт и охотно принимает и рассматривает любые предложения.

Ссылка на страницу проекта: http://code.google.com/p/pure-lang/
Ссылка на документацию (pdf): http://docs.pure-lang.googlecode.com/hg/puredoc.pdf
Ссылка на пример полной реализации АВЛ-деревьев: http://pure-lang.googlecode.com/hg/pure/examples/avltree.pure
Репозиторий (лицензия LGPLv3): hg clone https://code.google.com/p/pure-lang/

★★★★★

на странице проекта сходу показан пример для печати «the first 1000 Fibonacci numbers», еще один ЯП для этой задачи не нужен

anonymous
()
Ответ на: комментарий от anonymous

Довольно страшненький пример, кстати. Код по ссылке примеров намного красивее и прозрачнее.

mix_mix ★★★★★
() автор топика

Кроме этого:

Поддерживает полноценную систему гигиенических макросов;

Есть плюсы перед хаскелем, а то не вижу, ткните что ль. Отнюдь не говорю что последний лучше, просто у него уже есть инфраструктура / библиотеки / комьюнити.

anonymous
()
Ответ на: комментарий от anonymous

Есть плюсы перед хаскелем, а то не вижу, ткните что ль.

Насколько я понял, основные отличия (не плюсы или минусы, а именно отличия) - это динамическая типизация и LLVM back-end.

mix_mix ★★★★★
() автор топика

Я не понимаю, как можно проектировать язык подобного уровня и не основывать его на S-выражениях. Как можно в здравом уме отказаться от всех тех преимуществ, которые даёт лисповая макросистема, хоть CL, хоть Racket? Отсюда можно сделать лишь вывод, что автор либо не знает лиспа, либо не осилил его и тогда встаёт вопрос о качестве и, соответственно, нужности его поделия.

anonymous
()
Ответ на: комментарий от mix_mix

Я вот который день почитываю доку, и он мне вообще видится весьма продуманным и грамотным скрещиванием лиспа и хаскела.

mix_mix ★★★★★
() автор топика
Ответ на: комментарий от anonymous

основывать его на S-выражениях

Не нужно же.
Какая разница как писать: "(complex 3 4)" или «3 <: 4», если в обоих случаях complex и <: можно сделать как функцией (в pure ко всему прочему из коробки каррируемой), так и макросом, если существует на то необходимость?

mix_mix ★★★★★
() автор топика
Ответ на: комментарий от mix_mix

3 <: 4

Спутал с показательной формой, конечно. В оригинале будет «3 +: 4». Не правда ли оригинально?

mix_mix ★★★★★
() автор топика

Pure is the successor of the author's Q language. It offers many new and powerful features and programs run much faster than their Q equivalents.

Пипец.

r2d2
()
Ответ на: комментарий от r2d2

Какие задачи этот язык решает лучше, чем другие существующие языки?

Быстрое прототипирование же, в особенности математики и всей, что с ней связано.

mix_mix ★★★★★
() автор топика
Ответ на: комментарий от r2d2

Pure is the successor of the author's Q language.

На этот язык я, кстати, как раз вышел через Q - на ЛОРе некто писал, что сделал биржевую систему с временем обработки транзации в 200нс именно на Q. Насколько я понял, сама система была на ПЛИСах, а Q использовался для кодогенерации.

mix_mix ★★★★★
() автор топика

The Pure interpreter is able to achieve very good performance

А хаскель как? Как в сравнению с питоном, с

ymuv ★★★★
()
Ответ на: комментарий от mix_mix

Так что кастуем alt-x, интересно знать что он думает про этот язык (или хотя бы про его предшественника Q)

mix_mix ★★★★★
() автор топика
Ответ на: комментарий от tailgunner

Эта хрень динамически типизирована

Как будто что-то плохое. Для прототипирования наоборот самое то, как и лисп, между прочем.

mix_mix ★★★★★
() автор топика
Ответ на: комментарий от mix_mix

Ну и чем оно там по ссылке лучше пихтона и руби?

anonymous
()
Ответ на: комментарий от buddhist

Забил на Q, забьет и на Pure.

С чего вы взяли, что он забил на Q? Она до сих поддерживается. Именно поэтому он и сделал Pure, чтоб не ломать обратную совместимость, считайте это второй версией Q.

mix_mix ★★★★★
() автор топика
Ответ на: комментарий от alienclaster

Питона и лиспа «хватит на всех»

Что-то мне кажется, что до появления питона все думали ровно так же про лисп, что его хватит на всех. Не хватило.

mix_mix ★★★★★
() автор топика

Во первых, term rewriting языков в природе не так уж и много. Так что для эволюции полезно появление чего либо нового в этой категории. Во вторых, они довольно креативно используют LLVM, язык стоит хотя бы того, чтобы поворовать у них некоторые полезные идеи.

anonymous
()
Ответ на: комментарий от alienclaster

Вот за что презираю ЛОР, так это за «не нужно». Местное ламерье вообще не понимает, что такое наука и что такое эволюция.

anonymous
()
Ответ на: комментарий от tailgunner

Ты еще скажи, сявка, что Mathematica «не нужно» и «динамический быдлоязычок». Тоже, кстати, почти полностью на term rewriting сделано, только намного тупее чем Pure.

ЛОР, такой ЛОР. Не меняется совершенно. Годы идут, а рыла те же, и столь же тупы и безграмотны. Расти надо, лохи!

anonymous
()
Ответ на: комментарий от anonymous

они довольно креативно используют LLVM

креативно-то оно конечно креативно... гораздо лучше чем товарищи из GHC, Rubinius, lua-llvm, etc. но, блин, неканонично нифига

вот здесь канонично - http://ispc.github.com/, хоть и нет интерпретатора

shty ★★★★★
()
Ответ на: комментарий от mix_mix

Че ж тут оригинального, если создание собственных инфиксных операторов в хаскелле есть искаробки? Да и схемовские 3+4i выглядят приятней

anonymous
()
Ответ на: комментарий от anonymous

Че ж тут оригинального, если создание собственных инфиксных операторов в хаскелле есть искаробки?

Тут есть prefix (по умолчанию), infix, postfix и outfix - можно хоть «скобки» свои сделать.

Да и схемовские 3+4i выглядят приятней

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

mix_mix ★★★★★
() автор топика
Ответ на: комментарий от mix_mix

просто поражаюсь уровню вашей аргументации.

Покажи мне место в доке, которое описывает какие-то возможности Pure, дающие ему шанс на признание. Пока что единственная новация, которую я вижу - term rewriting как основа реализации интерпретатора. «Динамически типизированный Хаскель для народа» - это как раз заявка на ненужность.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Причем, если это именно term rewriting, то дело плохо, ибо там в отличие от graph rewriting, отсутствует шаринг, а значит постоянно дублируются вычисления.

anonymous
()
Ответ на: комментарий от mix_mix

А mixfix есть, как в Agda?

Ты так говоришь, будто у схемы ппц какое жирное ведро. А для «языка с поддержкой комплексных чисел искаробки» можно было б и синтаксисом для них озаботиться.

anonymous
()
Ответ на: комментарий от anonymous

Причем, если это именно term rewriting, то дело плохо, ибо там в отличие от graph rewriting, отсутствует шаринг

И в FAQ, и в Pure Language and Library Documentation говорится именно о term.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

Хотя, конечно, зависит от конкретной стратегии редукции термов. Если используется энергичный порядок вычислений, то дублирования, конечно, не будет. Но тогда и не ясно, при чем тут вообще Haskell тогда, если речь про динамически типизированный язык со энергичной стратагией вычислений. Если порядок ленивый, то дело гораздо хуже.

P.S. Странно, что на первой странице объяснения никто еще не спросил, какая стратегия вычислений используется. Неужели ответ всем очевиден?

anonymous
()
Ответ на: комментарий от anonymous

Пардоньте, s/объяснения/обсуждения/

anonymous
()
Ответ на: комментарий от anonymous

Нашел.

Expressions are normally evaluated in a leftmost-innermost fashion, using call-by-value semantics. (Pure also provides means to do call-by-need evaluation, but we won't go into that here.) http://code.google.com/p/pure-lang/wiki/Rewriting

В общем, порядок строгий по-умолчанию. Причем где-то есть возможность воспользоваться ленью. Эдакий term rewriting, местами переходящий в graph rewriting, но как именно — никто на wiki не расскажет :)

P.S. Чем больше читаю фак, тем дальше язык оказывается от хацкеля.

anonymous
()
Ответ на: комментарий от mix_mix

Насколько я понял, основные отличия (...)

Pure и Haskell — это практически каноничный пример того, что два языка с похожим синтаксисом крайне разнятся в семантике. Pure использует совсем другую стратегию вычислений и совсем другую систему типов. Совершенно другой язык, сравнивать их практически бессмысленно.

anonymous
()
Ответ на: комментарий от anonymous

In PURE, a call to gets always has the side effect of reading a line from the user. Thus, the expression line1 + line2 will be exactly the same as gets + gets, and also equivalent to line1 + line1. However, no actual calls to gets will be executed until at least some expression involving line1 or line2 is evaluated. The PURE compiler will evaluate any calls to gets in the order dictated by the evaluation of an expression, rather than by the order of definition of line1 and line2.

Вот такое вот pure, которое с side effects. Фи.

anonymous
()

Существует ли пример вычисления чисел фибоначчи в константном объеме памяти? А то в факе советуют стек увеличить, если фибоначчи не вычисляются :)

anonymous
()
Ответ на: комментарий от mix_mix

Быстрое прототипирование же, в особенности математики

Какой математики?

power
()
Ответ на: комментарий от mix_mix

Какая разница как писать: "(complex 3 4)" или «3 <: 4»

Разница та же, как между (let ((id1 expr1) (id2 expr2) ...) body ...) и (let (id1 expr1 id2 expr2 ...) body ...) - формы вроде первой легко генерируются и разбираются в макросах, вторые - сложно. По-этому для ЯП, в котором последние формы встречаются достаточно часто, макросы неприменимы принципиально. Какой-бы мощной макросистема ни была сама по себе.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.