Как далеко макросы LISP могут пойти? [закрытый]

45
задан Mike Stone 18 September 2008 в 04:57
поделиться

14 ответов

Это - действительно хороший вопрос.

я думаю, что это является детальным, но определенно соответствующим:

Макросы не застревают в s-выражениях. Посмотрите макрос ЦИКЛА для очень сложного языка записанные ключевые слова использования (символы). Так, в то время как можно запустить и закончить цикл круглыми скобками, в нем имеет его собственный синтаксис.

Пример:

(loop for x from 0 below 100
      when (even x)
      collect x)

Однако самые простые макросы просто используют s-выражения. И Вы застряли бы с помощью них.

, Но s-выражения, как Sergio ответил, начните чувствовать себя хорошо. Синтаксис уходит с дороги, и Вы начинаете кодировать в синтаксическом дереве.

Что касается макросов читателя, да, Вы могли очевидно записать что-то вроде этого:

#R{
      ruby.code.goes.here
  }

, Но необходимо было бы записать собственный синтаксический анализатор синтаксиса Ruby.

можно также подражать некоторым конструкциям Ruby, как блоки, с макросами, которые компилируют в существующие конструкции Lisp.

#B(some lisp (code goes here))

перевел бы в [1 114]

(lambda () (some lisp (code goes here)))

, Видят эта страница для того, как сделать это.

34
ответ дан Eric Normand 8 November 2019 в 00:41
поделиться

Я не эксперт Lisp, heck я даже не программист Lisp, но после небольшого количества экспериментирования с языком я пришел к выводу, что через некоторое время круглая скобка начинает становиться 'невидимой', и Вы начинаете видеть код, поскольку Вы хотите, чтобы он был. Вы начинаете уделять больше внимания синтаксическим конструкциям, которые Вы создаете через s-exprs и макросы, и меньше к лексической форме текста списков и круглой скобки.

Это специально верно при использовании в своих интересах хорошего редактора, который помогает с добавлением отступа, и синтаксис, окрашивающий (попытайтесь установить круглую скобку на цвет, очень похожий на фон).

Вы не могли бы быть в состоянии заменить язык полностью и получить синтаксис 'Ruby', но Вам не нужен он. Благодаря гибкости языка Вы могли закончить наличие диалекта, который чувствует, что Вы следуете за 'стилем Ruby программирования', если бы Вы хотите, независимо от того, что это значило бы для Вас.

я знаю, что это - просто эмпирическое наблюдение, но я думаю, что у меня был один из тех моментов просвещения Lisp, когда я понял это.

16
ответ дан Sergio Acosta 8 November 2019 в 00:41
поделиться

Да, можно переопределить синтаксис так, чтобы Lisp стал компилятором. Вы делаете это использование "Макросы Читателя", которые отличаются от нормальных "Макросов Компилятора", о которых Вы, вероятно, думаете.

язык Common LISP имеет встроенное средство для определения нового синтаксиса для макросов читателя и читателя для обработки того синтаксиса. Эта обработка сделана во время чтения (который прибывает перед компиляцией или время оценки). Для получения дополнительной информации об определении макросов читателя в языке Common LISP посмотрите Гиперспецификацию языка Common LISP - Вы захотите читать Ch. 2, "Синтаксис" и Ch. 23, "Читатель" . (Я полагаю, что Схема имеет то же средство, но я не так знаком с ним - посмотрите источники Схемы для язык программирования Дуги ).

Как простой пример, давайте предположим, что Вы хотите, чтобы Lisp использовал фигурные скобки, а не круглые скобки. Это требует чего-то как следующие определения читателя:

;; { and } become list delimiters, along with ( and ).
(set-syntax-from-char #\{ #\( )
(defun lcurly-brace-reader (stream inchar) ; this was way too easy to do.
  (declare (ignore inchar))
  (read-delimited-list #\} stream t))
(set-macro-character #\{ #'lcurly-brace-reader)

(set-macro-character #\} (get-macro-character #\) ))
(set-syntax-from-char #\} #\) )

;; un-lisp -- make parens meaningless
(set-syntax-from-char #\) #\] ) ; ( and ) become normal braces
(set-syntax-from-char #\( #\[ )

Вы говорите Lisp, который {похож (и что} похож на a). Тогда Вы создаете функцию (lcurly-brace-reader), который назовет читатель каждый раз, когда она видит {и Вы используете set-macro-character для присвоения той функции {. Тогда Вы говорите Lisp, что (и) похожи [и] (то есть, не значимый синтаксис).

Другие вещи, которые Вы могли сделать, включают, например, создание нового строкового синтаксиса или использование [и] включить инфиксную нотацию и обработать его в S-выражения.

можно также пойти далеко вне этого, переопределив весь синтаксис с собственными макро-символами, которые инициируют действия в читателе, таким образом, небо действительно будет пределом. Это - только одна из причин, почему Paul Graham и другие продолжают говорить, что Lisp является хорошим языком, на котором можно записать компилятор.

22
ответ дан Sean Harrison 8 November 2019 в 00:41
поделиться

Много раз вновь прибывшие к Lisp хотят "избавиться от всей круглой скобки". Это длится в течение нескольких недель. Никакой проект создать серьезный синтаксис программирования общей цели сверху обычного синтаксического анализатора S-выражения никогда не добирается нигде, потому что программисты неизменно волнуют предпочтение, что Вы в настоящее время чувствуете как "ад круглой скобки". Требуется немного привыкающее к, но не очень! Как только Вы действительно привыкаете к нему, и можно действительно ценить пластичность синтаксиса по умолчанию, возвращаясь к языкам, где существует только один способ выразить какую-то конкретную конструкцию программирования, действительно скрипуче.

Однако Lisp является превосходной подложкой для создания Предметно-ориентированных языков. Столь же хороший как, если не лучше, чем, XML.

Удачи!

15
ответ дан jfm3 8 November 2019 в 00:41
поделиться

Лучшее объяснение макросов Lisp, которые я когда-либо видел, по телефону

https://www.youtube.com/watch? v=4NO83wZVT0A

, запускающийся приблизительно в 55 минут в. Это - видео доклада, сделанного Peter Seibel, автором "Практического языка Common LISP", который является лучшим учебником Lisp существует.

мотивацию для макросов Lisp обычно трудно объяснить, потому что они действительно добиваются признания в ситуациях, которые слишком долги для представления в простом учебном руководстве. Peter придумывает яркий пример; можно схватить его полностью, и это преуспевает, надлежащее использование макросов Lisp.

Вы спросили: "Вы могли изменить функциональную природу LISP в более объектно-ориентированный синтаксис и семантику". Ответ - да. На самом деле Lisp первоначально не имел никакого объектно-ориентированного программирования вообще, не удивляя, так как Lisp был вокруг начиная с пути перед объектно-ориентированным программированием! Но когда мы сначала узнали об ООП в 1978, мы смогли добавить его к Lisp легко, использованию, среди прочего, макросам. В конечном счете Система объекта языка Common LISP (CLOS) была разработана, очень мощная система объектно-ориентированного программирования, которая соответствует изящно Lisp. Все это может быть загружено как расширение - ничто не встроено! Это все сделано с макросами.

Lisp имеет совершенно различную функцию, названную "макросы читателя", которые могут использоваться для расширения поверхностного синтаксиса языка. Используя макросы читателя, можно сделать подъязыки, которые имеют подобный C или подобный Рубину синтаксис. Они преобразовывают текст в Lisp, внутренне. Они не используются широко большинством настоящих программистов Lisp, главным образом потому что трудно расширить интерактивную среду разработки для понимания нового синтаксиса. Например, команды добавления отступа Emacs были бы перепутаны новым синтаксисом. Если Вы энергичны, тем не менее, Emacs расширяем также, и Вы могли бы преподавать его своему новому лексическому синтаксису.

12
ответ дан Múna 8 November 2019 в 00:41
поделиться

Ад круглой скобки? Я не вижу больше круглой скобки в:

(function toto)

, чем в:

function(toto);

И в

(if tata (toto)
  (titi)
  (tutu))

не больше, чем в:

if (tata)
  toto();
else
{
  titi();
  tutu();
}

я вижу меньше скобок и'';все же.

10
ответ дан Sébastien RoccaSerra 8 November 2019 в 00:41
поделиться

То, что Вы спрашиваете, несколько похоже на выяснение, как стать опытным продавцом шоколада так, чтобы можно было удалить весь этот адский коричневый материал из любимого шоколадного торта.

9
ответ дан user15700 8 November 2019 в 00:41
поделиться

Регулярные макросы воздействуют на списки объектов. Обычно, эти объекты являются другими списками (таким образом формирующий деревья) и символы, но они могут быть другими объектами, такими как строки, хеш-таблицы, пользовательские объекты, и т.д. Эти структуры называют s-exps.

Так, при загрузке исходного файла компилятор Lisp проанализирует текст и произведет Макросы s-экспорта, воздействуют на них. Это работает отлично, и это - изумительный способ расширить язык в духе s-экспорта

Кроме того, вышеупомянутый процесс парсинга может быть расширен через "макросы читателя", которые позволяют Вам настроить способ, которым Ваш компилятор превращает текст в s-экспорт. Я предлагаю, однако, чтобы Вы охватили синтаксис Lisp вместо того, чтобы изогнуть его во что-то еще.

Вы звучите немного смущенными, когда Вы упоминаете "функциональный характер Lisp" и "объектно-ориентированный синтаксис Ruby". Я не уверен, что "объектно-ориентированный синтаксис", как предполагается, но Lisp является языком мультипарадигмы, и это поддерживает объектно-ориентированное программирование чрезвычайно хорошо.

BTW, когда я говорю Lisp, я имею в виду язык Common LISP .

я предполагаю, что Вы убираете свои предубеждения, и дают Lisp честное движение .

11
ответ дан Luís Oliveira 8 November 2019 в 00:41
поделиться

Да, можно существенно изменить синтаксис, и даже выйти "из ада круглых скобок". Для этого необходимо будет определить новый синтаксис читателя. Изучите макросы читателя.

я действительно подозреваю однако, что для достижения уровня экспертного знания Lisp для программирования таких макросов необходимо будет погрузить себя в язык до такой степени, что Вы больше не будете рассматривать parenthese "ад". Т.е. к тому времени, когда Вы знаете, как избежать их, Вы приедете для принятия их как хорошую вещь.

6
ответ дан HD. 8 November 2019 в 00:41
поделиться

@sparkes

Иногда LISP является четким выбором языка, а именно, расширениями Emacs. Я уверен, что мог использовать Ruby для расширения Emacs, если бы я хотел, но Emacs был разработан, чтобы быть расширенным с помощью LISP, таким образом, это, кажется, имеет смысл использовать его в той ситуации.

1
ответ дан Mike Stone 8 November 2019 в 00:41
поделиться

Это - хитрый вопрос. Так как шепелявость уже структурно так близко к дереву синтаксического анализа, различие между большим количеством макросов и реализацией Вашего собственного мини-языка в парсере-генераторе не очень ясно. Но, за исключением открытия и закрытия paren, Вы могли очень легко закончить с чем-то, что не смотрит ничто как шепелявость.

1
ответ дан John with waffle 8 November 2019 в 00:41
поделиться

Одно из использования макросов, которые унесли мой ум, было проверкой времени компиляции запросов SQL против DB.

, Как только Вы понимаете, у Вас есть полный язык под рукой во время компиляции, он открывает интересные новые перспективы. Который также означает, что можно выстрелить себе в ногу интересными новыми способами (как рендеринг компиляции, не восстанавливаемой, который может очень легко превратиться в кошмар отладки).

1
ответ дан Nowhere man 8 November 2019 в 00:41
поделиться

посмотрите этот пример того, как макросы читателя могут расширить средство чтения шепелявости с помощью сложных задач как шаблонная обработка XML:

http://common-lisp.net/project/cl-quasi-quote/present-class.html

этот пользовательская библиотека компиляции статические части XML в UTF-8 закодировали литеральные массивы байтов во время компиляции, которые готовы быть записью-sequence'd в сетевой поток. и они применимы в нормальных макросах шепелявости, они являются ортогональными... размещение влияний символа запятой, какие части являются постоянными и которые должны быть оценены во времени выполнения.

[еще 116] детали, доступные в: http://common-lisp.net/project/cl-quasi-quote/

другой проект, что для расширений синтаксиса языка Common LISP: http://common-lisp.net/project/cl-syntax-sugar/

2
ответ дан Attila Lendvai 8 November 2019 в 00:41
поделиться

Если Вы хотите, чтобы шепелявость была похожа на использование Ruby Ruby.

возможно использовать Ruby (и Python) в очень шепелявость как путь, который является одной из главных причин, они получили принятие так быстро.

2
ответ дан sparkes 8 November 2019 в 00:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: