При написании генерации кода постоянно натыкаюсь на ошибки (свои), связанные с подстановкой
переменных в кодоцитаты. Когда при подстановке простой строки нужно при ней что-то указывать.
Описание, приведенное в учебнике, лично мне не везде понятно. Но, главное, человек, впервые решивший
написать свой макрос сталкивается с непонятными ошибками, которые не указывают истинной причины.
Веду я к тому, что очень разумно было бы сделать по умолчанию вставку строк без всяких usesite, dyn ..
это уменьшило бы и порог вхождения и увеличило ясность большинства кода и в учебниках, и для юзера.
Попалось на глаза, что в Nemerle2 хотите сделать возможность описания макросов в одном проекте с использующим.
Вряд ли что путное из этого выйдет исходя из моего опыта в Boo, где такая фишка реализована.
плюс. — не делать отдельный проект
минус — невозможность макросов отладки и контроля за получаемым кодом. то есть существенное и разумное сделать — огромная проблема.
фактически — кодинг вслепую и отладка в голове.
сейчас адаптируя свой макрокод к Nemerle и наблюдая что происходит на каждом шаге я как в сказку попал.
так что по моему опыту — это бессмысленная трата времени.
Здравствуйте, _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_>так что по моему опыту — это бессмысленная трата времени.
Ну тут уж, мудрецы пусть скажут, я не знаю что может быть если делать макросы в одном проекте с использованием, но вероятно теоритически такая возможность должна быть. Влад вряд ли захочет делать лишнюю работу если она не даст лучших результатов и прежде чем не обмозгуем как это реализовать.
Здравствуйте, _Claus_, Вы писали:
_C_>При написании генерации кода постоянно натыкаюсь на ошибки (свои), связанные с подстановкой _C_>переменных в кодоцитаты. Когда при подстановке простой строки нужно при ней что-то указывать.
Для констант мы буквально недавно упростили вставку. Если нужно вставить целое или строку, то теперь это делается без указания подробностей.
_C_>Описание, приведенное в учебнике, лично мне не везде понятно. Но, главное, человек, впервые решивший _C_>написать свой макрос сталкивается с непонятными ошибками, которые не указывают истинной причины. _C_>Веду я к тому, что очень разумно было бы сделать по умолчанию вставку строк без всяких usesite, dyn .. _C_>это уменьшило бы и порог вхождения и увеличило ясность большинства кода и в учебниках, и для юзера.
Я думал об этом и пришел к выводу, что это плохая идея. Это приведет к тому, что ошибки будут выявляться только при компиляции сгенерированного макросом кода. Соответственно будет трудно понять что реально не так.
Что надо реально сделать — это улучшить сообщения об ошибках. А то сейчас, во многих случаях, действительно сообщения не позволяют выявить причину ошибки.
_C_>Попалось на глаза, что в Nemerle2 хотите сделать возможность описания макросов в одном проекте с использующим.
Ты не правильно понял. Макросы не планируется динамически компилировать. Просто изменится способ описания синтаксических расширений. Ты сам уже нарывался на неочевидности текущей реализации. В Н2 это будет устранено. В Н2 можно будет просто описать нужный синтаксис получить работающее решение. При этом в синтаксисе макроса можно будет использовать другие макрос описанные в этом же модуле (макросы будут распологаться в модулях) или в других модулях на которые можно сделать ссылку (находящиеся в этой же или других длл-ях).
Макросы по прежнему будут компилироваться в сборки и их можно будет точно так же отлаживать. Из тела макроса по прежнему нельзя будет обратиться к еще не скомпилированному макросу (расположенному этой же сборки). Так что тут идет речь только об использовании синтаксиса других макросов, а не о физическом использовании.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, _Claus_, Вы писали:
_C_>>При написании генерации кода постоянно натыкаюсь на ошибки (свои), связанные с подстановкой _C_>>переменных в кодоцитаты. Когда при подстановке простой строки нужно при ней что-то указывать.
VD>Для констант мы буквально недавно упростили вставку. Если нужно вставить целое или строку, то теперь это делается без указания подробностей.
Недавно это до октября или после? вот в таком коде чистую строку $private_ref отказывается подставлять.
Здравствуйте, _Claus_, Вы писали:
VD>>Для констант мы буквально недавно упростили вставку. Если нужно вставить целое или строку, то теперь это делается без указания подробностей. _C_>Недавно это до октября или после? вот в таком коде чистую строку $private_ref отказывается подставлять.
_C_> private_ref = $"$(fld_name)_" _C_> def x = <[decl: mutable $private_ref : $fld_type ]>
Нет такое невозможно, ему нужен сплайс с цветом, то есть $(private_ref : usesite), перегрузки чтобы из литерала делать это сейчас нет, да и не очень трудоемкая задача указывать контекст. Литералы применяются при построении в квази-цитатах, где в конечном коде нужно "голое" значение. Раньше для этого применялся синтаксис $(str : string), решили что можно это сократить, без лишних проблем. Например:
CU>Нет такое невозможно, ему нужен сплайс с цветом, то есть $(private_ref : usesite), перегрузки чтобы из литерала делать это сейчас нет, да и не очень трудоемкая задача указывать контекст.
Она не трудоемкая, она недоступная для начинающего Н-программиста в силу отсутствия глубины понимания, почему именно эту строку я не могу сюда вставить. Упростить вставку простых строк везде весьма разумно. потому что даже имеющие опыт метапрограмминга в других языках могут не понять,
почему нельзя вставить строку как есть. а не имеющие тем более.