Существуют ли какие-либо чисто функциональные схемы или Lispы?
Я играл с несколькими функциональными языками программирования и действительно наслаждаюсь синтаксисом s-expr, используемым Lisps (в частности, Scheme).
Я также вижу преимущества работы на чисто функциональном языке. Поэтому:
Существуют ли какие-либо чисто функциональные схемы (или вообще Lisps)?
Ответы
Ответ 1
Наверное, нет, по крайней мере, не что иное, как игрушки/доказательства концепции. Обратите внимание, что даже Haskell не является на 100% чисто функциональным - у него есть секретные люки-побеги, а что-либо в IO
только "чистое" в какой-то мучительной, - смысл слова.
Итак, что вы действительно нуждаетесь в чисто функциональном языке? Вы можете написать чисто функциональный код практически на любом языке с разной степенью неудобства и неэффективности.
Конечно, языки, которые предполагают универсальную модификацию состояния, делают болезненным, чтобы вещи были чистыми, поэтому, возможно, вы действительно хотите, чтобы язык, который поощряет неизменность? В этом случае вам может показаться целесообразным взглянуть на философию Clojure. И это Lisp, для загрузки!
В качестве заключительной заметки, поймите, что большая часть синтаксиса Haskell - это толстые слои сахара. Основной язык не намного больше, чем типизированное исчисление лямбда, и ничто не мешает вам писать весь ваш код таким образом. Однако вы можете получить забавные взгляды от других программистов Haskell. Там также Liskell, но я не уверен, что это состояние в наши дни.
В заключительной, практической заметке: если вы хотите на самом деле написать код, который собираетесь использовать, а не просто возиться с вещами для удовольствия, вам действительно нужен умный компилятор, который знает, как работать с чистыми структурами кода/неизменяемых данных.
Ответ 2
Новый Racket язык (ранее PLT Scheme) позволяет реализовать любую семантику, которая вам нравится с s-выражениями (на самом деле любой синтаксис), Базовый язык - это нетерпеливо оцененный, динамически типизированный вариант схемы, но некоторые известные языки, построенные сверху, представляют собой ленивую схему и функциональную реактивную систему под названием "Отец времени".
Легкий способ сделать чисто функциональный язык в Racket - взять базовый язык и не предоставлять никаких процедур, которые мутируют состояние. Например:
#lang racket/base
(provide (except-out (all-from-out racket/base) set! ...more here...))
составляет язык, который не имеет set!
.
Ответ 3
Существуют ли какие-либо чисто функциональные схемы (или вообще Lisps)?
Проверка ACL2 - это чистый Lisp. Это, однако, предназначено для доказательства теоремы, а не программирования, и, в частности, оно ограничено программами первого порядка. Однако он был чрезвычайно успешным в своей нише.
Помимо всего прочего, она получила награду
Ответ 4
Я не верю, что есть какие-то чисто функциональные Lisps, но Clojure, вероятно, самый близкий.
Богатый Хикки, создатель Clojure:
Почему я написал еще один язык программирования? В основном потому, что я хотел Lisp для функционального программирования разработанный для Concurrency и не смог найти его.
http://clojure.org/rationale
Clojure является функциональным с неизменяемыми типами данных и переменными, но вы можете получить изменчивое поведение в некоторых особых случаях или спуститься до Java (Clojure работает на JVM).
Это по дизайну - другая цитата Rich -
чисто функциональное программирование язык подходит только для компьютер.
Смотрите презентацию Clojure для Lisp программистов.
Ответ 5
непоследовательный и нерасширяемый синтаксис
Что такое "несогласованность" здесь?
Нечетно основывать выбор языка soley на синтаксисе. В конце концов, синтаксис обучения займет несколько часов - это небольшая часть требуемых инвестиций.
Для сравнения, важные соображения, такие как скорость, типизация, мобильность, широта библиотек, документация и сообщество, оказывают гораздо большее влияние на то, можно ли быть продуктивным.
Игнорируя всю пламенную приманку, быстрый google для неизменяемой схемы дает некоторые результаты:
http://blog.plt-scheme.org/2007/11/getting-rid-of-set-car-and-set-cdr.html
Ответ 6
30 лет назад было lispkit lisp
Не уверен, насколько это доступно сегодня.
[Это одно из мест, где я изучил функциональное программирование]
Ответ 7
Если вам нравится синтаксис 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)
Ответ 8
Есть несколько проектов, которые нацелены на использование haskell под синтаксисом lispy. Более старым, мертвым и более тяжелым является "Лискелл". Новым, более живым и более легким весом является hasp. Я думаю, вы можете найти его достойным взгляда.
Ответ 9
есть owl lisp, диалект схемы R5RS со всеми структурами данных, сделанными неизменными и некоторые дополнительные чистые структуры данных. Это не большой проект, но, по-видимому, он активно развивается и используется небольшой группой людей (из того, что я могу видеть на веб-сайте и в репозитории git). Также планируется включить поддержку R7RS и какой-то тип вывода. Поэтому, хотя он, вероятно, не готов к использованию в производстве, это может быть интересной задачей.