Фиксация Lisp Синтаксис
Будучи новичком в Lisp Мне интересно, может ли синтаксис Lisp "фиксироваться"?
Некоторые говорят, что синтаксис в Lisp является одной из самых сильных сторон. Я не совсем понимаю это.
Невозможно ли заменить "очевидные" круглые скобки комбинацией белых пространств, новых строк и отступов? Как в Python?
Мне кажется, что круглые скобки являются наиболее часто используемыми символами в коде Lisp. Мне интересно, правда ли это, но если это так, разве это не предложение, что в синтаксисе есть избыточность?
Есть ли простой ответ на вопрос - почему так много круглых скобок?
Например:
(defun factorial (x)
(if (= x 0)
1
(* x
(factorial (- x 1)))))
Почему бы и нет:
defun factorial (x)
if (= x 0)
1
* x
factorial
- x 1
например. закрыть круглые скобки в конце строки и всегда открывать их на новых строках.
Только 1 будет двусмысленным - это 1 или (1), но мы можем ввести исключение - одиночные токены не "перечисляются".
Может ли это работать?
Edit:
Спасибо всем! Теперь я вижу links на lispin сайт.
Ответы
Ответ 1
Что вы предлагаете, похоже, было реализовано в Lispin
Изменить: sindikat указывает в комментариях ниже, что ссылка больше не действительна. Здесь последняя действительная версия сайта из веб-архива: http://wayback.archive.org/web/20080517144846id_/http://www.lispin.org/
Ответ 2
Вы передумаете, как только напишите пару макросов.
Ответ 3
Это делалось много раз (препроцессор в 20 строк будет делать чудеса). Но есть также преимущество, чтобы они были ясными. Он приводит домой parallelism между кодом и данными и в некотором роде выводит вас из того мышления, которое заставляет вас находить их раздражающими.
Вы можете (для аналогичного примера) взять объектно-ориентированный язык и удалить всю синтаксическую группировку методов в классы (поэтому они стали, фактически, перегруженными функциями). Это позволило бы вам взглянуть на это больше, как на прямой императивный язык, но что-то тоже будет потеряно.
Когда вы смотрите на lisp, вы должны думать: "Все есть список. Ommm"
(Ну, хорошо, "Ommm" не является обязательным).
Ответ 4
"Возможно, этот процесс следует рассматривать как обряд прохождения для хакеров Lisp".
- Стил и Габриэль, "Эволюция Lisp", 1993
Ответ 5
Несколько раз я сравнивал код Lisp и эквивалентный код на других языках. Lisp у кода больше парсеров, но если вы считаете все группирующие символы [] {}() на других языках, Lisp имеет меньшее количество парнеров, чем все эти. Это не более подробный: он более последователен!
Если смотреть с этой точки зрения, "проблема" просто заключается в том, что Lisp использует один тип конструкции (списков) для всего. И это является основой для его макросов, его объектной системы, нескольких ее наиболее мощных циклов и т.д. То, что вы видите как второстепенную проблему стиля (если бы скобки выглядели более круче, вероятно), на самом деле является признаком владения языком.
Тем не менее, Lisp - это все, что нужно дать программисту. Если хотите, напишите свой собственный диалект, который позволит вам это сделать. Lisp (в отличие от некоторых языков, о которых я мог бы упомянуть!) - все о мощности программиста, поэтому используйте его. Если вы можете заставить его работать, возможно, он взлетит. Я не думаю, что так будет, но вам нечего мешать, и вы будете многому учиться в любом случае.
Ответ 6
Точкой синтаксиса lisp является ее небытие. S-выражение - это дерево тождеств, где древовидная структура обозначается символом parens (и). Стоит отметить, что sexps предназначался только для представления низкого уровня, но люди больше любили его и продолжали использовать его.
Что означает выражение для механизма выполнения , невероятно гибкое в lisp, а также контекстно-зависимое.
В других языках уровень чувствительности к контексту намного ниже, и набор строительных блоков, которые вы можете использовать для создания собственных абстракций, гораздо менее свободно расширяется. Поэтому особый синтаксис, обозначающий несколько заданных конструкций, подгоняет изображение.
В lisp я могу изменить смысл всего, даже в контексте, чувствительном к контексту. Наличие специального синтаксиса для нескольких предопределенных конструкций было бы глупо, потому что я мог бы использовать свои собственные "if" или мои собственные специализированные закрытия и т.д. Что, если мои новые "if" нужны 4 аргумента (например, для группировки определенных, если программы и рассказывать некоторым группам, которые всегда терпят неудачу или преуспевают в определенных ситуациях)? Как я могу расширить синтаксис предопределенного "if" ? Гораздо проще прибегнуть к AST (sexps), но зачем вообще беспокоиться о специальном синтаксисе?
Также обратите внимание, что использование редактора, такого как emacs, позволяет легко редактировать такое дерево структурированным способом. Например, наличие ключа для транспонирования двух узлов в дереве одинаково полезно для замены имен переменных и для замены двух операторов в программном блоке (подсказка: почему "дополнительные" парны полезны для let, cond и т.д.).
Итак, аргументация, почему несинтаксис lisp составляет, поэтому привлекателен для многих людей, которые привыкли к идее расширения языка вместо изгиба проблема в том, чтобы соответствовать предопределенному набору инструментов... но это не означает, что синтаксический сахар не используется для пользовательских конструкций!
Некоторые примеры синтаксиса, определяемого пользователем, который мы используем:
- cl-syntax-sugar - наиболее заметным расширением являются
[]
parens, используемые для крошечных закрытий, где вы не хотите называть замыкающие переменные
- cl-quasi-quote - в первую очередь синтаксис
<xml >
для встраивания генерации xhtml в код lisp (обратите внимание, что этот синтаксис предоставляется пользовательской библиотекой, и ее можно включить с учетом контекста)
Ответ 7
Это может сработать. Он назывался Dylan.
Ответ 8
Даже Пол Грэм, вокальный защитник семейства языков Lisp, удалил некоторые круглые скобки из своего диалекта Arc:
Примечание для Lisp хакеров: если вы привыкли к обычным Lisp cond
, это означает, что это одно и то же, но с меньшим количеством круглые скобки. Например.
(cond (a b)
(c d)
(t e))
становится
(if a b
c d
e)
(из Arc Tutorial)
Ответ 9
Существует два типа людей и торговля: те, кто обрабатывает информацию с помощью встроенной машины стека в своих мозгах и тех, кто потребляет ее в больших кусках или блоках. Эти группы взаимно несовместимы друг с другом; они читают разные книги, имеют разные стили написания и, самое главное, пишут код на разных языках программирования. Я принадлежу ко второй группе; однако я знаю многих программистов из первой группы.
Для людей первой группы нет абсолютно ничего плохого в вложенных предложениях и подзаголовках; они понимают рекурсию естественно; они медленно смотрят на код, оператор за строкой, строка за строкой, а стековая машина в своих мозгах продолжает подсчитывать скобки и круглые скобки на уровне подсознания. Синтаксис Lisp вполне закономерен для них. Черт, они, вероятно, изобрели стековые машины и язык Forth. Но покажите им, скажем, Python (oh noes!), И они беспомощно оглянутся на листы кода, не понимая, почему эти глупые блоки кода остаются открытыми, без соответствующих операторов закрытия.
Для нас, бедных парней во второй группе, в блоках нет другого варианта, кроме операторов группового кода, и визуально отступать от них. Мы смотрим на экран, заполненный кодом, сначала замечаем крупномасштабную структуру, затем отдельные функции или методы, затем группы операторов внутри этих методов, а затем строки и инструкции сверху вниз. Мы не можем думать линейно; нам нужны визуальные границы и чистые политики отступов. Следовательно, мы не можем сгибаться, чтобы работать с Lisp; для нас это нерегулярный беспорядок ключевых слов и глупых круглых скобок.
Большинство языков программирования совместимы с обоими способами мышления (эти "блоки" существуют по причине). Известными исключениями являются Lisp и Forth, которые являются только первой группой, и Python, который является второй группой. Я не думаю, что вам нужно адаптировать Lisp к вашему образу мышления, если вы принадлежите ко второй группе. Если вам по-прежнему нужен функциональный язык, попробуйте Haskell. Это функциональный язык, предназначенный для людей, которые думают в блоках, а не в стеках.
Ответ 10
Чтобы ответить на вопрос, почему:
Это основное использование, насколько я знаю, читаемость, так что люди, которые смотрят на ваш код, могут более легко расшифровать его.
Надеюсь, что это поможет.
Ответ 11
Мое личное мнение по этому поводу: не используйте символы новой строки и отступов как "неявные" разделители (мне также не нравится неявная группировка по приоритету оператора, но это другая, хотя и связанная тема).
Пример: Является ли это допустимым Python? Делает ли это то, что вы ожидаете?
if foo < 0 :
bar
else :
baz
quuz
У меня есть небольшое предложение: мы могли бы использовать препроцессор для ввода кода Python автоматически, помещая специальные символы в код, который сообщает ему, где начинается и заканчивается утверждение. Как насчет скобок для этого?
Ответ 12
Этот поток устарел, но я решил внести свой вклад, потому что создал очень похожую систему чтения.
EDIT: некоторые примеры использования:
!defun fact (n)
if (zerop n)
1
* n
fact
(1- n)
!defun fact !n
if !zerop n
1
!* n !fact !1- n
Для получения дополнительной информации проверьте домашнюю страницу проекта.
Ответ 13
Просматривая ссылки, я нашел это - синтаксис, чувствительный к отступу - есть также модуль Guile, который реализует этот синтаксис, поэтому можно было бы прямо попробовать.
Достаточно перспективный Lisp диалект (Arc) можно найти . (Думаю, сначала нужно, чтобы какой-нибудь реальный код посмотрел, как он себя чувствует)
Ответ 14
Вы можете взглянуть на Clojure. Малые скобки, но больше синтаксиса для запоминания.
Ответ 15
Я опробовал и написал пару синтаксисов, которые полагаются на отступы. При наилучших результатах весь синтаксис изменил его характер, и поэтому язык перешел от одного к другому. Хороший синтаксис, основанный на отступе, больше ничего не стоит рядом с lisp.
Проблема предоставления синтаксического значения для отступов не поднимается от идиотов и \t против обсуждения в виде пробелов. Токенизация - это не проблема, поскольку чтение новых строк и пробелов не должно быть сложнее, чем что-либо еще. Самое сложное заключается в том, чтобы определить, что отступ должен означать, где он появляется, и как добавить к нему смысл, не делая слишком сложного синтаксиса для языка.
Я начинаю рассматривать оригинальный синтаксис стиля lisp, в конце концов, лучше, когда вы минимизируете количество скобок с некоторым умным программированием. Это может быть сделано не так легко в текущих реализациях lisp, но в будущих реализациях lisp это может быть сделано проще. Быстро и просто анализировать, когда есть только пара правил, которые вы должны выполнять, и почти не разбираться вообще.
Ответ 16
Существует альтернативный синтаксис Racket .
@foo{blah blah blah}
читается как
(foo "blah blah blah")