Аннотация:
Во второй части статьи о макросах Nemerle речь пойдет о макросах уровня выражения, о макросах, изменяющих синтаксис языка, а также о контексте компиляции, доступном в макросах, и тех возможностях, которые он предоставляет (типизации выражений, получении доступа к описанию типов проекта, информации о методах и т.п.).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
VD>Народ! О каких бы аспектах создания макросов хотелось бы почитать в следующих частях статьи?
1. Хотелось бы макросов, реализующих linq. Ничего страшного если он будет иметь не 100% linq-синтаксис по причине занятости ключевых слов.
2. Еще волнует проблема когда с совпадающими именами макросов. Особенно это касается макросов-операторов. Насколько я понял Nemerle в этом случае выбирает один из. Хотелось бы чтобы как минимум летели эксепшены. Как максимум можно было уточнить макрос пространством имен. Типа:
def val = foo + bar;// если так не компилится
def val = foo Namespace.+ bar;// делаем так
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 можно спокойно обойтись.
Здравствуйте, alvas, Вы писали:
A>1. Хотелось бы макросов, реализующих linq. Ничего страшного если он будет иметь не 100% linq-синтаксис по причине занятости ключевых слов.
Конечно хотелось бы. Только над этим надо работать. Мы планируем заняться этим, но у нас свои задачи и не факт, что мы будем именно интегрировать LINQ. Возможно мы сделаем что-то похожее, но свое.
A>2. Еще волнует проблема когда с совпадающими именами макросов. Особенно это касается макросов-операторов. Насколько я понял Nemerle в этом случае выбирает один из. Хотелось бы чтобы как минимум летели эксепшены.
Если макросы, в том числе и макрооператоры, пересекаются, то компилятором выдается сообщение об ошибке.
...
...\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.
Здравствуйте, VladD2, Вы писали:
VD>Конечно хотелось бы. Только над этим надо работать. Мы планируем заняться этим, но у нас свои задачи и не факт, что мы будем именно интегрировать LINQ. Возможно мы сделаем что-то похожее, но свое.
Влад, а как там насчет extension macros? Я видел запрос еще висит.
((lambda (x) (list x (list 'quote x))) '(lambda (x) (list x (list 'quote x))))
Re[5]: Макросы Nemerle – расширенный курс. Часть 2.
Здравствуйте, Kisloid, Вы писали:
K>Влад, а как там насчет extension macros? Я видел запрос еще висит.
Насколько я помню авторы сказали, что это довольно сложно.
Надо их дергать. В приципе фича полезная. Если покатило бы я бы еще был рад если были бы extension-свойства. А то иногда хочется добавить свойство типа Last, ан нет. Приходится делать его методом, а оно ведь по сути свойство.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Интересно было бы почитать (или чтобы рассказали), как устроен синтаксический разборщик nemerle. Как я понимаю, при задании макроса с syntax модифицируется грамматика языка, или используется какой-нибудь понтовый хак. Еще интересно, какие ограничения на синтаксис макросов. Работает ли LL(1) разборщик или LALR, и можно ли расширить задание синтаксиса до LALR...
Меня очень проперла идея, что можно дать программисту возможность не только задавать свои типы, но и синтаксис — по сути новый язык...
Не все в этом мире можно выразить с помощью нулей и единиц...
Re[2]: Макросы Nemerle – расширенный курс. Часть 2.
Здравствуйте, 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.
Здравствуйте, Evgeniy13, Вы писали:
E>Интересно было бы почитать (или чтобы рассказали), как устроен синтаксический разборщик nemerle. Как я понимаю, при задании макроса с syntax модифицируется грамматика языка, или используется какой-нибудь понтовый хак. Еще интересно, какие ограничения на синтаксис макросов. Работает ли LL(1) разборщик или LALR, и можно ли расширить задание синтаксиса до LALR...
Если не ошибаюсь, в одной из статей есть поверхностное описание процесса парсинга. Парсер в Немерле рукописный. Используется метод рекурсивного спуска. Но есть свои особенности. Главная — это PreParse-шаг. На нем ваыявляется стркуткура файла и распознается использование синтаксических макросов.
Предлагаю внимательно прочесть все имеющиеся статьи на нашем сайте, и если что-то окажется непонятно (или не раскрыто), то я охотно поясню.
E>Меня очень проперла идея, что можно дать программисту возможность не только задавать свои типы, но и синтаксис — по сути новый язык...
Все же язык остается прежнем. Но он более гибок и позволяет создавать нужные программистам расширения.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.