Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 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 и какой-то тип вывода. Поэтому, хотя он, вероятно, не готов к использованию в производстве, это может быть интересной задачей.