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 ]>
Поэтому, как мне кажется, это просто опечатка, повлекшая за собой неверный вывод об ошибке в системе квазицитирования.
Пока все, читаю дальше