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