Здравствуйте, konsoletyper, Вы писали:
K>Первый вопрос. Почему не компилится вот такой код:
K>K> public macro AlgebraicType(t : TypeBuilder)
K> {
K> match (t.GetTydecl())
K> {
K> | <[decl: public variant $(nm : name) { $body } ]> =>
K> Message.Warning($"$nm");
K>
Потому что не поддерживается такой шаблон.
Могу ошибаться, но поддерживаются только шаблоны выражений, которыми декларации не являются.
Так что
public macro AlgebraicType(t : TypeBuilder)
{
match (t.GetTydecl())
{
| TopDeclaration.Variant =>
Message.Warning($"$t");
...
t.GetVariantOptions ()
...
K>Вместо этого вылетает исключение.
В принципе оно показывает местонахождение и описание проблемы.
K>Второй вопрос. Опишу задачу. Есть макрос, который должен брать некий тип A, и получать из него все публичные методы, такие, что типы параметров и тип возвращаемого значения могут быть либо bool, либо типа B. Причём, A и B должны быть найдены по имени (string). Как правильно решается данная задача? Как представлять A и B? Я в иерархии сборки Nemerle.Compiler.dll для одного только представления типа нашёл около 10 способов, и в чём фишка каждого не понятно.
macros/Late.n строки 158-168 вероятно помогут, там происходит преобразование PExpr->TypeInfo, публичные методы из TypeInfo кажется можно вытащить.