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

Фиксация 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 сайт.

4b9b3361

Ответ 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")