эксперименты с макросами
От: para  
Дата: 28.09.09 07:38
Оценка: 90 (1)
Здравствуйте!
Хочу предложить простенький макрос "saving".

using Nemerle;
using Nemerle.Utility;
using Nemerle.Compiler;
using Nemerle.Compiler.Parsetree;
using Nemerle.Compiler.Typedtree;

namespace ParaLib.Nemerle.Macros
{
    module SavingMacroHelper
    {
        public Saving(_body : PExpr, _arg : PExpr) : PExpr
        {
            def tmpVarName = Macros.NewSymbol();        

            def pre = <[def $(tmpVarName :name) = $(_arg)]>;
            def post = <[$(_arg) = $(tmpVarName :name)]>;            

            def res = <[
                $(pre);
                try
                {
                    $(_body);
                }
                finally
                {
                    $(post);
                }
            ]>;           

            res;
        }        
    }    

    macro @saving (body, arg : expr)
    syntax ("saving", "(", arg, ")", body) 
    {
        SavingMacroHelper.Saving(body, arg);
    }
}


Похож на using =)

Зачем:
    saving(member.Body.Location)
    {
         mb.Body = <[
            ...
            $(member.Body)
         ]>;
    }


1. Замечания/предложения?
2. Как можно использовать макрос в той же сборке для разработки других макросов, или надо делать промежуточную библиотеку?
Re: эксперименты с макросами
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.09.09 08:17
Оценка:
Здравствуйте, para, Вы писали:

P>2. Как можно использовать макрос в той же сборке для разработки других макросов, или надо делать промежуточную библиотеку?


Подключить ее к той же сборке с помощью ключа -macros:имя-сборки. Но при этом прийдется хранить бинарник, так как без него ее скомпилировать будет нельзя. Так компилируется библиотека стандартных макросов.
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: эксперименты с макросами
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.09.09 08:21
Оценка: 4 (1)
Здравствуйте, para, Вы писали:

Кстати, мне кажется код можно упростить, так как нет смысла вводить имя переменной вручную. Система гигиены и так сделает это за нас:

using Nemerle;
using Nemerle.Utility;
using Nemerle.Compiler;
using Nemerle.Compiler.Parsetree;
using Nemerle.Compiler.Typedtree;

namespace ParaLib.Nemerle.Macros
{
    module SavingMacroHelper
    {
        public Saving(_body : PExpr, _arg : PExpr) : PExpr
        {
            <[
                def pre = $_arg;

                try
                {
                  $_body;
                }
                finally
                {
                  $_arg = pre;
                }
            ]>
        }        
    }    

    macro @saving (body, arg : expr)
    syntax ("saving", "(", arg, ")", body) 
    {
        SavingMacroHelper.Saving(body, arg);
    }
}
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.