мысли про Nemerle макросы
От: _Claus_  
Дата: 27.11.11 12:18
Оценка: 5 (1)
При написании генерации кода постоянно натыкаюсь на ошибки (свои), связанные с подстановкой
переменных в кодоцитаты. Когда при подстановке простой строки нужно при ней что-то указывать.
Описание, приведенное в учебнике, лично мне не везде понятно. Но, главное, человек, впервые решивший
написать свой макрос сталкивается с непонятными ошибками, которые не указывают истинной причины.
Веду я к тому, что очень разумно было бы сделать по умолчанию вставку строк без всяких usesite, dyn ..
это уменьшило бы и порог вхождения и увеличило ясность большинства кода и в учебниках, и для юзера.

Попалось на глаза, что в Nemerle2 хотите сделать возможность описания макросов в одном проекте с использующим.
Вряд ли что путное из этого выйдет исходя из моего опыта в Boo, где такая фишка реализована.
плюс. — не делать отдельный проект
минус — невозможность макросов отладки и контроля за получаемым кодом. то есть существенное и разумное сделать — огромная проблема.
фактически — кодинг вслепую и отладка в голове.
сейчас адаптируя свой макрокод к Nemerle и наблюдая что происходит на каждом шаге я как в сказку попал.
так что по моему опыту — это бессмысленная трата времени.
Re: мысли про Nemerle макросы
От: CodingUnit Россия  
Дата: 27.11.11 14:33
Оценка: +1
Здравствуйте, _Claus_, Вы писали:

_C_>При написании генерации кода постоянно натыкаюсь на ошибки (свои), связанные с подстановкой

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

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

_C_>Веду я к тому, что очень разумно было бы сделать по умолчанию вставку строк без всяких usesite, dyn ..

_C_>это уменьшило бы и порог вхождения и увеличило ясность большинства кода и в учебниках, и для юзера.
Вот это не совсем правильно, поскольку без таких подсказок невозможно описать точное поведение компилятору, что именно мы хотим сделать с строкой которую даем в квазицитату, сейчас без указания доп слова в сплайсе, строки обычно преобразуются в PExpr.Literal то есть целиком остаются в квазицитате и только правильно их использование в сплайсе даст то что нужно, и контекст здесь указывать обязательно (usesite, dyn, global), обычно всегда используется либо usesite для ссылки на локальное имя или $str для вставки строки как литерала.

_C_>Попалось на глаза, что в Nemerle2 хотите сделать возможность описания макросов в одном проекте с использующим.

_C_>Вряд ли что путное из этого выйдет исходя из моего опыта в Boo, где такая фишка реализована.
_C_>плюс. — не делать отдельный проект
_C_>минус — невозможность макросов отладки и контроля за получаемым кодом. то есть существенное и разумное сделать — огромная проблема.
_C_>фактически — кодинг вслепую и отладка в голове.
_C_>сейчас адаптируя свой макрокод к Nemerle и наблюдая что происходит на каждом шаге я как в сказку попал.
_C_>так что по моему опыту — это бессмысленная трата времени.

Ну тут уж, мудрецы пусть скажут, я не знаю что может быть если делать макросы в одном проекте с использованием, но вероятно теоритически такая возможность должна быть. Влад вряд ли захочет делать лишнюю работу если она не даст лучших результатов и прежде чем не обмозгуем как это реализовать.
Re: мысли про Nemerle макросы
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.11.11 16:25
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>При написании генерации кода постоянно натыкаюсь на ошибки (свои), связанные с подстановкой

_C_>переменных в кодоцитаты. Когда при подстановке простой строки нужно при ней что-то указывать.

Для констант мы буквально недавно упростили вставку. Если нужно вставить целое или строку, то теперь это делается без указания подробностей.

_C_>Описание, приведенное в учебнике, лично мне не везде понятно. Но, главное, человек, впервые решивший

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

Я думал об этом и пришел к выводу, что это плохая идея. Это приведет к тому, что ошибки будут выявляться только при компиляции сгенерированного макросом кода. Соответственно будет трудно понять что реально не так.

Что надо реально сделать — это улучшить сообщения об ошибках. А то сейчас, во многих случаях, действительно сообщения не позволяют выявить причину ошибки.


_C_>Попалось на глаза, что в Nemerle2 хотите сделать возможность описания макросов в одном проекте с использующим.


Ты не правильно понял. Макросы не планируется динамически компилировать. Просто изменится способ описания синтаксических расширений. Ты сам уже нарывался на неочевидности текущей реализации. В Н2 это будет устранено. В Н2 можно будет просто описать нужный синтаксис получить работающее решение. При этом в синтаксисе макроса можно будет использовать другие макрос описанные в этом же модуле (макросы будут распологаться в модулях) или в других модулях на которые можно сделать ссылку (находящиеся в этой же или других длл-ях).

Макросы по прежнему будут компилироваться в сборки и их можно будет точно так же отлаживать. Из тела макроса по прежнему нельзя будет обратиться к еще не скомпилированному макросу (расположенному этой же сборки). Так что тут идет речь только об использовании синтаксиса других макросов, а не о физическом использовании.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: мысли про Nemerle макросы
От: _Claus_  
Дата: 28.11.11 11:09
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, _Claus_, Вы писали:


_C_>>При написании генерации кода постоянно натыкаюсь на ошибки (свои), связанные с подстановкой

_C_>>переменных в кодоцитаты. Когда при подстановке простой строки нужно при ней что-то указывать.

VD>Для констант мы буквально недавно упростили вставку. Если нужно вставить целое или строку, то теперь это делается без указания подробностей.

Недавно это до октября или после? вот в таком коде чистую строку $private_ref отказывается подставлять.

private_ref = $"$(fld_name)_"
def x = <[decl: mutable $private_ref : $fld_type ]>
Re[3]: мысли про Nemerle макросы
От: CodingUnit Россия  
Дата: 28.11.11 11:23
Оценка:
Здравствуйте, _Claus_, Вы писали:

VD>>Для констант мы буквально недавно упростили вставку. Если нужно вставить целое или строку, то теперь это делается без указания подробностей.

_C_>Недавно это до октября или после? вот в таком коде чистую строку $private_ref отказывается подставлять.

_C_> private_ref = $"$(fld_name)_"

_C_> def x = <[decl: mutable $private_ref : $fld_type ]>

Нет такое невозможно, ему нужен сплайс с цветом, то есть $(private_ref : usesite), перегрузки чтобы из литерала делать это сейчас нет, да и не очень трудоемкая задача указывать контекст. Литералы применяются при построении в квази-цитатах, где в конечном коде нужно "голое" значение. Раньше для этого применялся синтаксис $(str : string), решили что можно это сократить, без лишних проблем. Например:


def str = "return value";

<[decl: Test() : string
 {
  $str
 }

]>


тоже относится и к остальным литералам (числам и тп)

Сейчас для указания имен членов нужны полные сплайсы с контекстом, обычное $expr, дает обычно раскрытие другого выражения.
Re[4]: мысли про Nemerle макросы
От: _Claus_  
Дата: 28.11.11 11:55
Оценка: +1
CU>Нет такое невозможно, ему нужен сплайс с цветом, то есть $(private_ref : usesite), перегрузки чтобы из литерала делать это сейчас нет, да и не очень трудоемкая задача указывать контекст.

Она не трудоемкая, она недоступная для начинающего Н-программиста в силу отсутствия глубины понимания, почему именно эту строку я не могу сюда вставить. Упростить вставку простых строк везде весьма разумно. потому что даже имеющие опыт метапрограмминга в других языках могут не понять,
почему нельзя вставить строку как есть. а не имеющие тем более.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.