Макросы Nemerle – расширенный курс. Часть 2.
От: Чистяков Влад (VladD2) Российская Империя www.nemerle.org
Дата: 31.07.07 07:14
Оценка: 641 (11)
Статья:
Макросы Nemerle – расширенный курс. Часть 2.
Автор(ы): Чистяков Владислав Юрьевич
Дата: 18.08.2011
Во второй части статьи о макросах Nemerle речь пойдет о макросах уровня выражения, о макросах, изменяющих синтаксис языка, а также о контексте компиляции, доступном в макросах, и тех возможностях, которые он предоставляет (типизации выражений, получении доступа к описанию типов проекта, информации о методах и т.п.).


Авторы:
Чистяков Влад (VladD2)

Аннотация:
Во второй части статьи о макросах Nemerle речь пойдет о макросах уровня выражения, о макросах, изменяющих синтаксис языка, а также о контексте компиляции, доступном в макросах, и тех возможностях, которые он предоставляет (типизации выражений, получении доступа к описанию типов проекта, информации о методах и т.п.).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Макросы Nemerle – расширенный курс. Часть 2.
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.10.07 12:43
Оценка:
Народ! О каких бы аспектах создания макросов хотелось бы почитать в следующих частях статьи?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Макросы Nemerle – расширенный курс. Часть 2.
От: Иванков Дмитрий Россия  
Дата: 22.10.07 17:37
Оценка: 68 (1)
Здравствуйте, Чистяков Влад (VladD2), Вы писали:

ЧВV>Статья:

ЧВV>Макросы Nemerle – расширенный курс. Часть 2.
Автор(ы): Чистяков Владислав Юрьевич
Дата: 18.08.2011
Во второй части статьи о макросах Nemerle речь пойдет о макросах уровня выражения, о макросах, изменяющих синтаксис языка, а также о контексте компиляции, доступном в макросах, и тех возможностях, которые он предоставляет (типизации выражений, получении доступа к описанию типов проекта, информации о методах и т.п.).


| <[ $minExpr <= $i =< $maxExpr ]> => 
  <[ for (mutable $i = $minExpr;     $i =< $maxExpr; $i += $step) $body ]>
| <[ $minExpr <  $i =< $maxExpr ]> => 
  <[ for (mutable $i = $minExpr + 1; $i =< $maxExpr; $i += $step) $body ]>
[skipped]

но почему-то этот код не срабатывает (видимо, имеется ошибка в системе квази-цитирования) и не распознает требуемые образцы.

Бугога, долго же я искал в чем дело, "=<"
Отловить смог только скомпилив с -dt, самый мощный способ оказывается
Re[2]: Макросы Nemerle – расширенный курс. Часть 2.
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.10.07 17:46
Оценка:
Здравствуйте, Иванков Дмитрий, Вы писали:

ИД>

ИД>

ИД>| <[ $minExpr <= $i =< $maxExpr ]> => 
ИД>  <[ for (mutable $i = $minExpr;     $i =< $maxExpr; $i += $step) $body ]>
ИД>| <[ $minExpr <  $i =< $maxExpr ]> => 
ИД>  <[ for (mutable $i = $minExpr + 1; $i =< $maxExpr; $i += $step) $body ]>
ИД>[skipped]
ИД>

ИД>но почему-то этот код не срабатывает (видимо, имеется ошибка в системе квази-цитирования) и не распознает требуемые образцы.

ИД>Бугога, долго же я искал в чем дело, "=<"
ИД>Отловить смог только скомпилив с -dt, самый мощный способ оказывается

Хочешь сказать, что если заменить =< на <=, то компилятор отматчит это дело за один проход?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Макросы Nemerle – расширенный курс. Часть 2.
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.10.07 17:51
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Хочешь сказать, что если заменить =< на <=, то компилятор отматчит это дело за один проход?


Мля, точно.

Нда, учитывая, что с Немерел работают такие как я, над сообщениями об ошибках надо поработать по лучше.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: typo
От: Иванков Дмитрий Россия  
Дата: 22.10.07 18:19
Оценка:
Здравствуйте, Чистяков Влад (VladD2), Вы писали:

"В днном месте видно $count переменных(ая)."

"А" пропущено тут и пару раз далее соответственно
Re[2]: Макросы Nemerle – расширенный курс. Часть 2.
От: alvas  
Дата: 22.10.07 19:10
Оценка:
VD>Народ! О каких бы аспектах создания макросов хотелось бы почитать в следующих частях статьи?

1. Хотелось бы макросов, реализующих linq. Ничего страшного если он будет иметь не 100% linq-синтаксис по причине занятости ключевых слов.
2. Еще волнует проблема когда с совпадающими именами макросов. Особенно это касается макросов-операторов. Насколько я понял Nemerle в этом случае выбирает один из. Хотелось бы чтобы как минимум летели эксепшены. Как максимум можно было уточнить макрос пространством имен. Типа:

def val = foo + bar;// если так не компилится

def val = foo Namespace.+ bar;// делаем так
http://alvas.net — Аудио-инструменты для .Net разработчиков
Re[3]: Макросы Nemerle – расширенный курс. Часть 2.
От: alvas  
Дата: 22.10.07 19:17
Оценка:
VD>>Народ! О каких бы аспектах создания макросов хотелось бы почитать в следующих частях статьи?

A>1. Хотелось бы макросов, реализующих linq. Ничего страшного если он будет иметь не 100% linq-синтаксис по причине занятости ключевых слов.

A>2. Еще волнует проблема когда с совпадающими именами макросов. Особенно это касается макросов-операторов. Насколько я понял Nemerle в этом случае выбирает один из. Хотелось бы чтобы как минимум летели эксепшены. Как максимум можно было уточнить макрос пространством имен. Типа:

A>
A>def val = foo + bar;// если так не компилится

A>def val = foo Namespace.+ bar;// делаем так
A>


Еще что хотел сказать. Ответы типа List comprehension круче слышал. И ничего не имею против.
Просто Nemerle преподносится новичкам как C# + много вкусностей.
По-этому было бы не плохо чтобы он поддерживал все вкусности C# и VB.

P.S. Ничего не имею против того что он не поддерживает unsafe. Как ты мы с тобой Владом обсуждали эту тему. Он мне показал что без unsafe можно спокойно обойтись.
http://alvas.net — Аудио-инструменты для .Net разработчиков
Re[3]: Макросы Nemerle – расширенный курс. Часть 2.
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.10.07 19:23
Оценка:
Здравствуйте, alvas, Вы писали:

A>1. Хотелось бы макросов, реализующих linq. Ничего страшного если он будет иметь не 100% linq-синтаксис по причине занятости ключевых слов.


Конечно хотелось бы. Только над этим надо работать. Мы планируем заняться этим, но у нас свои задачи и не факт, что мы будем именно интегрировать LINQ. Возможно мы сделаем что-то похожее, но свое.

A>2. Еще волнует проблема когда с совпадающими именами макросов. Особенно это касается макросов-операторов. Насколько я понял Nemerle в этом случае выбирает один из. Хотелось бы чтобы как минимум летели эксепшены.


Если макросы, в том числе и макрооператоры, пересекаются, то компилятором выдается сообщение об ошибке.
...
namespace Test2
{
  macro @*** (_p1, _p2)
  {
    <[ () ]>
  }
}

namespace Test
{
  macro @*** (_p1, _p2)
  {
    <[ () ]>
  }
}

...
1 *** 2;

Выведет:
...\Main.n(40,5):Error: name '***' is ambiguous, it could be:
...\Main.n(40,5):Error: Test2.*** this macro
...\Main.n(40,5):Error: Test.*** or this macro
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Макросы Nemerle – расширенный курс. Часть 2.
От: Kisloid Мухосранск  
Дата: 23.10.07 09:04
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Конечно хотелось бы. Только над этим надо работать. Мы планируем заняться этим, но у нас свои задачи и не факт, что мы будем именно интегрировать LINQ. Возможно мы сделаем что-то похожее, но свое.


Влад, а как там насчет extension macros? Я видел запрос еще висит.
((lambda (x) (list x (list 'quote x))) '(lambda (x) (list x (list 'quote x))))
Re[5]: Макросы Nemerle – расширенный курс. Часть 2.
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.10.07 10:14
Оценка:
Здравствуйте, Kisloid, Вы писали:

K>Влад, а как там насчет extension macros? Я видел запрос еще висит.


Насколько я помню авторы сказали, что это довольно сложно.

Надо их дергать. В приципе фича полезная. Если покатило бы я бы еще был рад если были бы extension-свойства. А то иногда хочется добавить свойство типа Last, ан нет. Приходится делать его методом, а оно ведь по сути свойство.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Макросы Nemerle – расширенный курс. Часть 2.
От: Evgeniy13 Россия  
Дата: 22.01.08 15:20
Оценка:
Интересно было бы почитать (или чтобы рассказали), как устроен синтаксический разборщик nemerle. Как я понимаю, при задании макроса с syntax модифицируется грамматика языка, или используется какой-нибудь понтовый хак. Еще интересно, какие ограничения на синтаксис макросов. Работает ли LL(1) разборщик или LALR, и можно ли расширить задание синтаксиса до LALR...
Меня очень проперла идея, что можно дать программисту возможность не только задавать свои типы, но и синтаксис — по сути новый язык...
Не все в этом мире можно выразить с помощью нулей и единиц...
Re[2]: Макросы Nemerle – расширенный курс. Часть 2.
От: Сергей Туленцев Россия http://software.tulentsev.com
Дата: 22.01.08 15:47
Оценка:
Здравствуйте, Evgeniy13, Вы писали:

E>Интересно было бы почитать (или чтобы рассказали), как устроен синтаксический разборщик nemerle. Как я понимаю, при задании макроса с syntax модифицируется грамматика языка, или используется какой-нибудь понтовый хак. Еще интересно, какие ограничения на синтаксис макросов. Работает ли LL(1) разборщик или LALR, и можно ли расширить задание синтаксиса до LALR...

E>Меня очень проперла идея, что можно дать программисту возможность не только задавать свои типы, но и синтаксис — по сути новый язык...

Ограничений там есть. По крайней мере, одно приходит на ум сразу: скобки должны быть правильно сбалансированы. В том числе это касается и raw token macros.
Впрочем, Игорь и Влад расскажут гораздо более подробно.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
--
Re[2]: Макросы Nemerle – расширенный курс. Часть 2.
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.01.08 12:20
Оценка:
Здравствуйте, Evgeniy13, Вы писали:

E>Интересно было бы почитать (или чтобы рассказали), как устроен синтаксический разборщик nemerle. Как я понимаю, при задании макроса с syntax модифицируется грамматика языка, или используется какой-нибудь понтовый хак. Еще интересно, какие ограничения на синтаксис макросов. Работает ли LL(1) разборщик или LALR, и можно ли расширить задание синтаксиса до LALR...


Если не ошибаюсь, в одной из статей есть поверхностное описание процесса парсинга. Парсер в Немерле рукописный. Используется метод рекурсивного спуска. Но есть свои особенности. Главная — это PreParse-шаг. На нем ваыявляется стркуткура файла и распознается использование синтаксических макросов.
Предлагаю внимательно прочесть все имеющиеся статьи на нашем сайте, и если что-то окажется непонятно (или не раскрыто), то я охотно поясню.

E>Меня очень проперла идея, что можно дать программисту возможность не только задавать свои типы, но и синтаксис — по сути новый язык...


Все же язык остается прежнем. Но он более гибок и позволяет создавать нужные программистам расширения.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.