Пара вопросов по статье "Макросы Немерле, расширенный курс".
От: febus Германия  
Дата: 17.08.11 23:51
Оценка:
1. В первой части есть такой вот пример:

macro BuildClass ()
{
  def ctx = Nemerle.Macros.ImplicitCTX();
  def astOfClass = <[ decl:
    internal class FooBar
    {
      public static SomeMethod () : void
      {
        System.Console.WriteLine ("Hello world");
      }
    }
  ]>;

  def builder = ctx.Env.Define(astOfClass);
 
  builder.Compile();
 
  <[ FooBar.SomeMethod () ]>
}



Класс FooBar объявлается internal в макросборке. Однако, я могу напрямую вызвать FooBar.SomeMethod (), несмотря на то, что FooBar объявлен как internal, т.е. по идее д.б. виден только внутри макросборки. Так и должно быть?

2. Во второй части, при объявлении макроса forindex говорится, что якобы есть ошибка в системе квазицитирования и потому вариант

| <[ $minExpr <= $i =< $maxExpr ]> => 
  <[ for (mutable $i = $minExpr;     $i =< $maxExpr; $i += $step) $body ]>
| <[ $minExpr <  $i =< $maxExpr ]> => 
  <[ for (mutable $i = $minExpr + 1; $i =< $maxExpr; $i += $step) $body ]>
| <[ $minExpr <  $i <  $maxExpr ]> => 
  <[ for (mutable $i = $minExpr + 1; $i <  $maxExpr; $i += $step) $body ]>
| <[ $minExpr <= $i <  $maxExpr ]> => 
  <[ for (mutable $i = $minExpr;     $i <  $maxExpr; $i += $step) $body ]>


не срабатывает. Действительно при попытке откомпилировать проект вылетает MatchFailureException.
Если внимательно присмотреться, то можно заметить весьма странный способ записи для меньше или равно: =<. Так вот, если в квазицитатах в приведенном выше куске заменить =< на <=, то все нормально распознается.
Т.е. так работает:

    | <[ $minExpr <= $i <= $maxExpr ]> => 
      <[ for (mutable $i = $minExpr;     $i <= $maxExpr; $i += $step) $body ]>
    | <[ $minExpr <  $i <= $maxExpr ]> => 
      <[ for (mutable $i = $minExpr + 1; $i <= $maxExpr; $i += $step) $body ]>
    | <[ $minExpr <  $i <  $maxExpr ]> => 
      <[ for (mutable $i = $minExpr + 1; $i <  $maxExpr; $i += $step) $body ]>
    | <[ $minExpr <= $i <  $maxExpr ]> => 
      <[ for (mutable $i = $minExpr;     $i <  $maxExpr; $i += $step) $body ]>


Поэтому, как мне кажется, это просто опечатка, повлекшая за собой неверный вывод об ошибке в системе квазицитирования.
Пока все, читаю дальше
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.