от
Я много читала, что Lisp может пересмотреть синтаксис на лету, предположительно с макросами. Мне любопытно, как далеко это пойдет? Вы можете переопределить структуру языка настолько, что граница становится компилятора на другой язык? Например, вы могли бы изменить функциональный характер сюсюкать в более объектно-ориентированного синтаксиса и семантики, может сказать, что синтаксис ближе к чему-то, как Руби? Особенно, можно ли избавиться от скобочки ад с помощью макросов? Я узнал достаточно (вообще)Лисп, чтобы настроить Emacs с моей микро-характеристики, но мне очень любопытно, как далеко макросы можете перейти в настройки языка.

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.

15 Ответы

0 голосов
от
Я много читала, что Lisp может пересмотреть синтаксис на лету, предположительно с макросами. Мне любопытно, как далеко это пойдет? Вы можете переопределить структуру языка настолько, что граница становится компилятора на другой язык? Например, вы могли бы изменить функциональный характер сюсюкать в более объектно-ориентированного синтаксиса и семантики, может сказать, что синтаксис ближе к чему-то, как Руби? Особенно, можно ли избавиться от скобочки ад с помощью макросов? Я узнал достаточно (вообще)Лисп, чтобы настроить Emacs с моей микро-характеристики, но мне очень любопытно, как далеко макросы можете перейти в настройки языка.
0 голосов
от
Это очень хороший вопрос. Я думаю, что это нюансы, но определенно отвечает: Макросы не застрял в S-выражения. Посмотреть макрос петли на очень сложном языке, написанные с использованием ключевых слов (символов). Так что, хотя вы можете начать и закончить петли со скобками, внутри он имеет свой собственный синтаксис. Пример:
(loop for x from 0 below 100
      when (even x)
      collect x)
Это, как говорится, самые простые макросы просто использовать s-выражений. И ты "застрял", используя их. Но s-выражений, как Серхио ответил, начинаете чувствовать себя хорошо. Синтаксис выходит из образа и запустить кодирование в синтаксическое дерево. Как для читателя макросы, да, вы могли бы написать что-то вроде этого:
#R{
      ruby.code.goes.here
  }
Но вам нужно написать свой собственный парсер синтаксиса Ruby. Вы также можете имитировать некоторые конструкты Руби, как и блоки, с помощью макросов, которые компилируются в существующие конструкции Лиспа.
#B(some lisp (code goes here))
перевел бы в
(lambda () (some lisp (code goes here)))
Видите эту страницу, как это сделать.
0 голосов
от
Да, вы можете изменить синтаксис, так что шепелявить будет компилятор. Вы делаете это через "ридер макросы", которые отличаются от обычных "макросы компилятора", что вы, вероятно, думаете. Общий Лисп имеет встроенный механизм, чтобы определить новый синтаксис для читателя и читатель макросы для обработки, что синтаксис. Эта обработка осуществляется на чтение время (которое доходит до компиляции или eval времени). Чтобы узнать больше об определении ридер макросы в общий Лисп, увидеть общий Hyperspec сюсюкать ... вы хотите читать ч. 2, "синтаксис" и CH. 23, "читатель". (Я считаю, что схема имеет тот же объект, но я не так хорошо знаком с ним-видеть источники схема для языка программирования дуги). В качестве простого примера, предположим, что вы хотите сюсюкаться, чтобы использовать фигурные скобки, а не круглые скобки. Для этого требуется что-то вроде следующего определения читатель:
;; { and } become list delimiters, along with ( and ).
(set

Ты говоришь сюсюкать, что { как ( и } как ). Затем создать функцию (lcurly), что читатель будет вызывать всякий раз, когда он видит {, и вы используете set, чтобы назначить эту функцию к {. Затем вы говорите, что Лисп ( а ) как [ и ] (то есть, не имеет смысла синтаксис).

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

Вы также можете пойти далеко за пределы этого, пересматривая весь синтаксис с собственного макроса символы, которые будут вызывать действия на читателя, так что небо действительно предел. Это только одна из причин, почему Пол Грэм и другие повторяют, что Lisp-это хороший язык для написания компиляторов.
0 голосов
от
Я не картавят экспертов, черт возьми, я даже не Лисп программист, но после небольшого экспериментирования с языком, я пришел к выводу, что через некоторое время скобочки начинают становиться "невидимыми", и вы начинаете видеть код так, как вы хотите быть. Вы начнете больше обращать внимание на синтаксические конструкции можно создать через S-exprs и макросы, и меньше в лексической форме текстов списков и скобочки. Это особенно верно, если вы воспользуетесь хороший редактор, который помогает с отступом и подсветкой синтаксиса (попробуйте установить скобку к цвет очень похож на фон). Вы, возможно, не смогут полностью заменить язык и получить 'Рубин' синтаксис, но вам не нужно это. Благодаря гибкости языка ты можешь иметь диалект, который чувствует, как вы 'рубиновый стиле программирования-если вы хотите, что это будет означать для вас. Я знаю, что это просто эмпирическое наблюдение, но я думаю, что я был один из тех сюсюкать просветления, минуты, когда я понял, что это.
0 голосов
от
Снова и снова, новички сюсюкать хотите "избавиться от всех скобочки". Он длится несколько недель. Без проекта строить серьезные общие цели программирования синтаксис поверх обычного S-выражения парсер никогда не получает в любом месте, потому что программисты всегда заводиться предпочитая то, что вы сейчас воспринимаете как "скобка ад". Это займет немного привыкнуть, но не сильно! Как только вы привыкнете к нему, и вы можете реально оценить пластичность синтаксис по умолчанию, возвращаюсь в языках, где есть только один способ, чтобы выразить какой-либо конкретной программной конструкции является очень раздражающей. Это, как говорится, Lisp является отличным субстратом для построения конкретных языков домена. Так же хорошо, как, если не лучше, чем в XML. Удачи!
0 голосов
от
Лучшее объяснение макросов Лиспа, которые я видел в https://www.youtube.com/watch?v=4NO83wZVT0A начиная примерно 55 минут. Это видео выступления Питер Сейбел, автор книги "практический общий Лисп", который является лучший учебник Лиспа нет. Мотивация на Лиспе макросы обычно трудно объяснить, потому что они действительно вступит в свои собственные в ситуациях, которые слишком длительным представить в простой учебник. Питер придумывает отличный пример; вы можете полностью понять его, и это делает хорошее, правильное использование макросов Лиспа. Вы спросили: "можешь ли ты изменить функциональный характер сюсюкать в более объектно-ориентированного синтаксиса и семантики". Ответ-да. На самом деле, Лисп изначально не было объектно-ориентированного программирования на всех, не удивительно, так как Лисп был вокруг, так как до объектно-ориентированного программирования! Но когда мы впервые узнали о ООП в 1978 году, мы смогли добавить ее к легко сюсюкать, используя, среди прочего, макросы. В конечном счете, общую систему Lisp объект (Кло) была разработана очень мощная объектно-ориентированная система программирования, которая элегантно впишется в Лиспе. Все дело может быть загружен в качестве дополнения-ничего встроенный! Все это делается с помощью макросов. Лисп имеет совершенно другую функцию, называется "читатель макросы", которые могут быть использованы для расширения синтаксиса поверхности языка. Читатель, используя макросы, вы можете сделать подъязыков, которые имеют C-подобный или Ruby-подобный синтаксис. Они преобразуют текст в Лиспе, внутренне. Они не широко используется большинством настоящие программисты на Лиспе, в основном потому, что это трудно для расширения интерактивной среды разработки, чтобы понять новый синтаксис. Например, команд Emacs отступы будут путать с новым синтаксисом. Если ты энергичный, хотя, Emacs является расширяемым, и вы могли бы научить его о свой новый лексический синтаксис.
0 голосов
от
Обычные макросы работают со списками объектов. Чаще всего, эти объекты в других списках (образуя деревьев) и символы, но они могут быть и другими объектами, такими как строки, хеш-таблицы, пользовательские объекты и т. д. Эти структуры под названием S-команде exps. Поэтому, когда вы загружаете исходный файл, компилятор Лиспа будет парсить текст и производить с-команде exps. Макросы работают на них. Это отлично работает, и это прекрасный способ расширить язык в духе с-команде exps. Кроме того, вышеупомянутый процесс парсинга может быть продлен через "ридер макросы", которые позволяют настроить способ вашего компилятора получается текст на S-команде exps. Однако я полагаю, что вы обнимаете синтаксис Лиспа, а не выгибайте ее во что-то другое. Вы немного запутались, когда вы упоминаете "функциональная природа сюсюкать" и "объектно-ориентированное Руби синтаксис". Я не уверен, что "объектно-ориентированный синтаксис" должен быть, но Lisp-это мультипарадигмальный язык и он поддерживает объектно-ориентированное программирование крайне хорошо. Кстати, когда я говорю сюсюкать, я имею в виду общий Лисп. Я предлагаю вам поставить свои предрассудки подальше и дать сюсюкать честный ехать.
0 голосов
от
Скобочки ад? Я не вижу больше скобок в:
(function toto)
чем в:
function(toto);
И в
(if tata (toto)
  (titi)
  (tutu))
не более чем в:
if (tata)
  toto();
else
{
  titi();
  tutu();
}
Я вижу меньше скобки и";", хотя.
0 голосов
от
То, что вы просите несколько как спрашивать как стать экспертом шоколатье, так что вы можете удалить все, что аццкий коричневые вещи из вашей любимой шоколадный торт.
0 голосов
от
Да, вы можете в корне изменить синтаксис, и даже побег "в скобках ад". Для этого вам потребуется определить новый синтаксис читателя. Смотреть в ридер макросы. Я, однако, подозреваю, что чтобы достичь уровня знаний Лиспе программировать такие макросы вы должны погрузиться в язык до такой степени, что вы больше не будете считать отель "ад". Т. е. к тому времени, вы знаете, как избежать их, вы начнете принимать их как благо.
Добро пожаловать на сайт ByNets, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...