Не пойму ошибку
От: Аноним  
Дата: 06.01.12 13:32
Оценка:
 macro gen(expr1:PExpr)
 syntax ("gen", expr1)
{
  match(expr1){
      | <[$per = $value]> => 
      { 
      def name=Macros.NewSymbol();
     <[
      decl: class $(name : name)
      {
         internal valuetemp;
     }
      
      def $per =  $value; 
      ]>
  }
  | _ => <[ ]>
}


Error 1 parse error near keyword `def': unexpected token after code quotation (you forget a closing bracket?). C:\Users\Администратор\Documents\Visual Studio 2008\Projects\MacroLibrary2\MacroLibrary2\Macro1.n 33 8 MacroLibrary2
Re: Не пойму ошибку
От: WolfHound  
Дата: 06.01.12 13:50
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Error 1 parse error near keyword `def': unexpected token after code quotation (you forget a closing bracket?). C:\Users\Администратор\Documents\Visual Studio 2008\Projects\MacroLibrary2\MacroLibrary2\Macro1.n 33 8 MacroLibrary2

1)Учись форматировать код. Это же просто ужос. А что если твой код будет поддерживать маньяк-убийца, который знает, где ты живешь?
2)Ты засунул class и def на один уровень. Так делать нельзя.
3)internal valuetemp; у тебя тоже не скомпилируется. Вывода типов для членов класса нет.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: Не пойму ошибку
От: CodingUnit Россия  
Дата: 06.01.12 14:09
Оценка: 46 (1)
Здравствуйте, Аноним, Вы писали:


 macro gen(expr1 : PExpr)
  syntax ("gen", expr1)
  {

    match(expr1)
    {
      | <[ $per = $value ]> =>
          def name=Macros.NewSymbol();
          <[ decl: class $(name : name)
            {
            internal valuetemp;
            }
          //def $per = $value;
          ]>
      | _ => <[ ]>

    }
  }


А>Error 1 parse error near keyword `def': unexpected token after code quotation (you forget a closing


Здесь Вы допустили несколько ошибок, матчить выражение можно так, это правильно, далее непонятно что Вы хотите получить, вы начали квазицитатой создавать класс, в нем поле без типа, а под ним еще выражение которое я закоментировал, в классе даже в обычном коде нельзя писать выражение уровня метода def $per = $value; эту цитату надо писать отдельно. И чтобы создать класс его сконструированное значение нужно подать в функцию типа DefineNestedType или Define. Примерно так:

using Nemerle;
using Nemerle.Compiler;
using Nemerle.Compiler.Parsetree;
using System;


namespace MacroLibrary1
{
  macro gen(expr1 : PExpr)
  syntax ("gen", expr1)
  {
    Macro3Impl.DoTransform(Macros.ImplicitCTX(), expr1)
  }

  module Macro3Impl
  {
    public DoTransform(typer : Typer, expr1 : PExpr) : PExpr
    {
      Macros.DefineCTX(typer);
      match(expr1)
      {
        | <[ $per = $value ]> =>
            def name=Macros.NewSymbol();
            def gen_class = <[ decl: class $(name : name)
                               {
                               internal mutable valuetemp : int; // я добавил mutable чтобы можно было изменить это поле

                               public Method() : void
                               {
                               valuetemp = $value // здесь можно использовать сплайсы для доступа к внешним вещам
                                // сюда подставится выражение из value, и значению поля будет в конечном классе  присвоено значение
                               }

                              }
                            ]>; // получаем кусок цитаты класса

            // в текущем классе вызвавшем макрос создаем подкласс процитированного нами класса
            typer.CurrentTypeBuilder.DefineNestedType(gen_class).Compile(); 

           <[ def $per = $value; ]> // результирующее выражение тоже надо писать отдельно от decl: квазицитаты

        | _ => <[ ]>

      }
    }
  }
}


вообще тело макроса писать лучше не в самом макросе а в хелпер методах, например теми которые генерируются с помощью визард диалогов создания макросов в студии, так вы получите полноценный интеллисенс и понятные сообщения об ошибках.
Re[2]: Не пойму ошибку
От: Аноним  
Дата: 06.01.12 14:31
Оценка:
не понятна причина почему нельзя описывать все вместе....
Re[3]: Не пойму ошибку
От: WolfHound  
Дата: 06.01.12 16:44
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А> не понятна причина почему нельзя описывать все вместе....

А ты можешь в обычном коде написать все вместе? Нет. Не можешь.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: Не пойму ошибку
От: Аноним  
Дата: 06.01.12 16:56
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, <Аноним>, Вы писали:


А>> не понятна причина почему нельзя описывать все вместе....

WH>А ты можешь в обычном коде написать все вместе? Нет. Не можешь.

Могу, правда не в C#....
не привычное ограничение...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.