Обобщенный аргумент в цитате
От: _NN_ www.nemerleweb.com
Дата: 16.09.13 07:34
Оценка:
Почему нельзя пользоваться usesite в данном примере ?
А если поставить dyn, то все работает.

using Nemerle;
using Nemerle.Compiler;
using Nemerle.Compiler.Parsetree;
using Nemerle.Compiler.Typedtree;
using Nemerle.Macros;

using System;

namespace MacroLibrary1
{
  [MacroUsage(MacroPhase.BeforeInheritance, MacroTargets.Assembly)]
  macro Macro2()
  {
    Macro2Impl.DoTransform(Macros.ImplicitCTX())
  }
  
  module Macro2Impl
  {
    public DoTransform(typer : Typer) : void
    {
      Macros.DefineCTX(typer);
     
      def a = <[ A[$("T" : usesite)] ]>; // dyn работает
      
      def x = typer.Env.Define(<[
         decl: public class A[T] { a : $a; } ]>); //  error : unbound type name `T'
      x.Compile();
    }
  }
}
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Обобщенный аргумент в цитате
От: _NN_ www.nemerleweb.com
Дата: 16.09.13 07:48
Оценка:
Здравствуйте, _NN_, Вы писали:

Отвечу сам себе.
Нужно использовать цитату "name".
Более того можно использовать ее и в определении обобщенных аргументов.

def t = Name("T");
def a = <[ A[$(t : name)] ]>;
      
def x = typer.Env.Define(<[ decl: public class A[$(t : name)] { a : $a; } ]>);
x.Compile();
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Обобщенный аргумент в цитате
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.09.13 23:58
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Почему нельзя пользоваться usesite в данном примере ?

_NN>А если поставить dyn, то все работает.

Очевидно потому, что usesite порождает имя с цветом места применения макроса, а цитаты с цветом самого макроса. Это и есть гигиена. Если бы ее не было, то все имена в макросах пересекались бы с аналогичными из основной программы или других макросов.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.