Существуют ли чисто функциональные схемы или лиспы? - PullRequest
31 голосов
/ 23 мая 2010

Я поиграл с несколькими функциональными языками программирования и действительно наслаждаюсь синтаксисом s-expr, используемым Лиспсом (в частности, Схемой).

Я также вижу преимущества работы на чисто функциональном языке. Поэтому:

Существуют ли чисто функциональные Схемы (или Лиспс в целом)?

Ответы [ 9 ]

24 голосов
/ 25 мая 2010

Новый язык Racket (ранее PLT Scheme) позволяет вам реализовать любую семантику, которая вам нравится, с помощью s-выражений (на самом деле любой синтаксис). Базовый язык - это динамически типизированный вариант схемы, который с нетерпением оценивают, но некоторые известные языки, построенные на вершине, представляют собой ленивую схему и функциональную реактивную систему под названием «Время отца».

Простой способ сделать чисто функциональный язык в Racket - это взять базовый язык и не предоставлять никаких процедур, изменяющих состояние. Например:

#lang racket/base
(provide (except-out (all-from-out racket/base) set! ...more here...))

составляет язык, который не имеет set!.

14 голосов
/ 23 мая 2010

Я не верю, что есть какие-то чисто функциональные Лиспы, но Clojure, вероятно, самый близкий.

Рич Хики, создатель Clojure:

Почему я написал еще один язык программирования? В основном потому, что я хотел Лисп для функционального программирования разработан для параллелизма и не может его найти.

http://clojure.org/rationale

Clojure является функциональным, с неизменяемыми типами данных и переменными, но в некоторых особых случаях вы можете получить изменчивое поведение или перейти на Java (Clojure работает на JVM).

Это по замыслу - еще одна цитата Рича

A чисто функциональное программирование язык хорош только для отопления вашего компьютер.

См. презентацию Clojure для программистов на Лиспе .

13 голосов
/ 23 мая 2010

Существуют ли какие-либо чисто функциональные Схемы (или Лиспс в целом)?

Доказатель теоремы ACL2 - чистый Лисп.Однако он предназначен для доказательства теорем, а не для программирования, и, в частности, он ограничен программами первого порядка.Тем не менее, он был чрезвычайно успешным в своей нише.Помимо всего прочего, он получил премию ACM Software System Award 2005 года .

12 голосов
/ 23 мая 2010

Вероятно, нет, по крайней мере, не как что-либо, кроме игрушек / доказательств концепции. Обратите внимание, что даже Haskell не является на 100% чисто функциональным - у него есть секретные аварийные люки, и все, что в IO, является только «чистым» в некотором мучительном, махающем рукой смысле слова .

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

Конечно, языки, которые предполагают универсальное изменение состояния, делают болезненным поддержание чистоты, так что, возможно, что вам действительно нужно, так это язык, который поощряет неизменность? В этом случае, возможно, вам стоит взглянуть на философию Clojure . И это Лисп, для загрузки!

В качестве заключительного замечания осознайте, что большая часть "синтаксиса" Хаскелла - это толстые слои сахара. Базовый язык - это не что иное, как типичное лямбда-исчисление, и ничто не мешает вам писать весь код таким образом. Вы можете получить забавные взгляды от других программистов на Haskell. Есть также Лискелл , но я не уверен, в каком он сейчас состоянии.

И последнее практическое замечание: если вы хотите на самом деле писать код, который вы намереваетесь использовать, а не просто заниматься чем-то интересным, вы действительно захотите умный компилятор, который знает, как работать с чистый код / ​​неизменяемые структуры данных.

5 голосов
/ 02 августа 2012

30 лет назад был lispkit lisp
Не уверен, насколько это доступно сегодня.
[Это одно из мест, где я изучал функциональное программирование]

5 голосов
/ 23 мая 2010

несовместимый и не расширяемый синтаксис

Что такое "несоответствие" здесь?

Странно, если выбор языка основан исключительно на синтаксисе. В конце концов, изучение синтаксиса займет несколько часов - это крошечная доля необходимых инвестиций.

Для сравнения, такие важные факторы, как скорость, дисциплина ввода, переносимость, широкий спектр библиотек, документация и сообщество, оказывают гораздо большее влияние на вашу продуктивность.

Игнорирование всей пламенной приманки, быстрый поиск неизменной схемы Google дает некоторые результаты: http://blog.plt -scheme.org / 2007/11 / посаживания избавиться-от-зор-автомобиль и установить в-cdr.html

4 голосов
/ 10 ноября 2012

есть owl lisp , диалект схемы R5RS со всеми сделанными структурами данных и некоторыми дополнительными структурами данных. Это не большой проект, но, похоже, он активно разрабатывается и используется небольшой группой людей (из того, что я вижу на сайте и в репозитории git). Также планируется включить поддержку R7RS и вывод типа. Так что, хотя, возможно, он еще не готов к использованию, с ним может быть весело играть.

3 голосов
/ 24 мая 2010

Есть несколько проектов, которые нацелены на использование haskell с использованием синтаксиса lispy.Более старый, более дорогой и тяжелый - «Лискелл».Более новый, более живой и легкий вес - hasp .Я думаю, что вы могли бы найти это стоит посмотреть.

3 голосов
/ 23 мая 2010

Если вам нравится синтаксис lisp, вы можете делать подобные вещи в Haskell

let fibs = ((++) [1, 1] (zipWith (+) fibs (tail fibs)))

let fibs = в стороне.Вы всегда можете использовать синтаксис s-expr в выражениях Haskell.Это потому, что вы всегда можете добавить круглые скобки снаружи, и это не будет иметь значения.Это тот же код без лишних скобок:

let fibs = (++) [1, 1] (zipWith (+) fibs (tail fibs))

И вот он в «типичном» стиле Haskell:

let fibs = [1, 1] ++ zipWith (+) fibs (tail fibs)
...