Я играл вокруг с несколькими языками функционального программирования и действительно наслаждаюсь s-expr синтаксисом, используемым, Шепелявит (Схема в особенности).
Я также вижу преимущества работы на чисто функциональном языке. Поэтому:
Есть ли какие-либо чисто функциональные Схемы (или Шепелявит в целом)?
Вероятно нет, по крайней мере, не иначе, как игрушки / доказательства концепции. Обратите внимание, что даже Haskell не является на 100% чисто функциональным - у него есть секретные аварийные люки, а все в IO
является «чистым» только в каком-то мучительном смысле этого слова ].
Итак, с учетом сказанного, вам действительно нужен чисто функциональный язык? Вы можете написать чисто функциональный код практически на любом языке с той или иной степенью неудобства и неэффективности.
Конечно, языки, которые предполагают универсальную модификацию состояния, затрудняют поддержание чистоты, так что, возможно, вам действительно нужен язык, поощряющий неизменность? В этом случае вам может быть полезно взглянуть на философию Clojure . И, кстати, это Лисп!
В заключение, поймите, что большая часть «синтаксиса» Haskell - это толстые слои сахара.Базовый язык - это не более чем типизированное лямбда-исчисление, и ничто не мешает вам писать весь код таким образом. Однако другие программисты на Haskell могут посмеяться над вами. Также есть Лискелл , но я не уверен, в каком он состоянии сейчас.
И последнее, практическое замечание: если вы действительно хотите писать код, который собираетесь использовать, а не просто возиться с вещами для развлечения, вам действительно нужен умный компилятор, который знает, как работать с чистый код / неизменяемые структуры данных.
Я не верю, что есть какие-либо чисто функциональные Lisp, но Clojure, вероятно, наиболее близок.
Рич Хики, создатель Clojure:
Почему я написал еще один язык программирования? В основном потому, что мне нужен Лисп для функционального программирования. разработан для параллелизма и не смог его найти.
Clojure является функциональным, с неизменяемыми типами данных и переменными, но вы можете получить изменяемое поведение в некоторых особых случаях или переключившись на Java (Clojure работает на JVM).
Это сделано намеренно - другая цитата Рича -
A чисто функциональное программирование. язык хорош только для обогрева вашего компьютер.
Существуют ли какие-либо чисто функциональные схемы (или Лиспы в целом)?
Средство доказательства теорем ACL2 является чистым Лиспом. Однако он предназначен для доказательства теорем, а не для программирования, и, в частности, ограничен программами первого порядка. Однако в своей нише он оказался чрезвычайно успешным. Среди прочего, он выиграл 2005 ACM Software System Award .
Есть несколько проектов, которые стремятся использовать haskell под лиспи-синтаксисом. Более старый, мертвый и тяжеловесный - «Лискелл». Более новый, более живой и легкий - hasp . Думаю, тебе стоит взглянуть.
непоследовательный и нерасширяемый синтаксис
Что здесь означает «несогласованность»?
Странно основывать выбор языка исключительно на синтаксисе. В конце концов, изучение синтаксиса займет несколько часов - это малая часть требуемых инвестиций.
Для сравнения, такие важные факторы, как скорость, дисциплина набора текста, переносимость, широта библиотек, документация и сообщество, имеют гораздо большее влияние на вашу продуктивность.
Игнорируя все приманки для пламени, быстрый поиск в Google для неизменяемой схемы дает некоторые результаты: http://blog.plt-scheme.org/2007/11/getting-rid-of-set-car-and-set-cdr.html
Новый язык Racket (ранее PLT Scheme) позволяет реализовать любую семантику, которая вам нравится, с s-выражениями (на самом деле любой синтаксис). Базовый язык является охотно оцениваемым, динамически типируемым вариантом схемы, но некоторые известные языки, построенные поверх этого, являются ленивой схемой и функциональной реактивной системой, называемой Отцом Временем.
Простой способ сделать чисто функциональный язык в Racket — взять базовый язык и не предоставлять никаких процедур, которые мутируют состояние. Например:
#lang racket/base
(provide (except-out (all-from-out racket/base) set! ...more here...))
составляет язык, который не имеет set!
.
Если вам нравится синтаксис 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)