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

Я поиграл с несколькими функциональными языками программирования и мне действительно понравился синтаксис 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:

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

http://clojure.org/rationale

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

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

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

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

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

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

Другие вопросы по тегам