вот макрос
macro test(i, m : int, n : int)
{
<[
def loop () : void
{
WriteLine( System.Convert.ToString($(n:int)));
//$body;
}
loop();
]>
}
вот использование
test(1,2,3); — работает
mutable t:int = 7;
test (1,2,t); а такое уже не работает. а почему ?
И еще вопрос: есть у меня локально объявленный масив . как его запихнуть в нутрь <[...]>.
тоетсть мне нужно как то сгенерить объявление масива и чтоб его содержимое стало равным моему.
Спасибо
30.01.07 18:21: Перенесено модератором из 'Декларативное программирование' — IT
Здравствуйте, chudo19, Вы писали:
C>вот использование C>test(1,2,3); — работает
C>mutable t:int = 7; C>test (1,2,t); а такое уже не работает. а почему ?
Потому что объявление параметра макроса как "n : int" означает, что передаваться должна обязательно именно целочисленная константа и ничто иное. Т.е. для твоей переменной заработает где-то вот такой макрос:
— так как запись "$(n : int)" тоже означает, что в AST должна вставиться константа, а у тебя на руках только имя переменной.
C>И еще вопрос: есть у меня локально объявленный масив . как его запихнуть в нутрь <[...]>. C>тоетсть мне нужно как то сгенерить объявление масива и чтоб его содержимое стало равным моему.
Пример кода хоть какого-то или поподробней объясни, что ты хочешь.
C>>И еще вопрос: есть у меня локально объявленный масив . как его запихнуть в нутрь <[...]>. C>>тоетсть мне нужно как то сгенерить объявление масива и чтоб его содержимое стало равным моему.
O>Пример кода хоть какого-то или поподробней объясни, что ты хочешь.
Пример
macro()
{
mutable compile_time_array:array[int] = GenerateSomeArray();
<[
mutable generated_code_array:array[int];
как проинициализировать generated_code_array тем что в compile_time_array
Здравствуйте, Oyster, Вы писали:
O>Здравствуйте, chudo19, Вы писали:
C>>как проинициализировать generated_code_array тем что в compile_time_array
O>Пожалуй, как-то так:
Эрм... Пример не работает. Помойму та же проблема что и у моего кода
Здравствуйте, chudo19, Вы писали:
C>А почему не работает так?
Ну просто потому что это неправильный код. Например, выражение "$(n : name)" ожидает, что у n будет тип Nemerle.Compiler.Parsetree.Name, а у тебя там массив Т.е. ты должен понять, что переменные, которые у тебя в макросе создаются, существуют только на этапе компиляции, и значения из них в AST нужно пропихивать явно.
O>Ну просто потому что это неправильный код. Например, выражение "$(n : name)" ожидает, что у n будет тип Nemerle.Compiler.Parsetree.Name, а у тебя там массив Т.е. ты должен понять, что переменные, которые у тебя в макросе создаются, существуют только на этапе компиляции, и значения из них в AST нужно пропихивать явно.
Ок . Тогда помогите плиз превратить его в правильный. Чтоб переменная связавалась
Как сгенерировать объявление и за ним цепочку присваиваний
Еще раз код :
{
mutable exps = [];
def generated_code_array = Macros.NewSymbol ();
exps = <[ mutable $(generated_code_array:name):array[int]= array($(lenArr:int)); ]>::exps;
for (mutable k = 0; k < m_arr.Length; k++)
{
exps = <[$(generated_code_array:name)[$(k:int)] = $(compile_time_array[k]:int) ;]>::exps;
}
Здравствуйте, chudo19, Вы писали:
C>Ок . Тогда помогите плиз превратить его в правильный. Чтоб переменная связавалась C>Как сгенерировать объявление и за ним цепочку присваиваний
(тем более что по другому у тебя не получится по причинам, описанным мной — локальные переменные макроса существуют только на этапе компиляции)?
Да меня устраивает. Я его и использую.
Просто меня заинтересовало как же все таки собирать выаржение из кусочков в котором надо использовать одну и туже переменную.
В частности вот для примера объявление и заполнение масива.
Здравствуйте, chudo19, Вы писали:
C>а вот такое нет
C><[ {..$exps}; WriteLine( $(generated_code_array : name)[0]);] >
C>в чем разница,ктонить может объяснить ?
То, что у тебя в конце ] и > разделены пробелом — это просто тут опечатка?
Здравствуйте, chudo19, Вы писали:
C>а вот такое нет
C><[ {..$exps}; WriteLine( $(generated_code_array : name)[0]);] >
C>в чем разница,ктонить может объяснить ?
Чтож поскольку никто не помог — дошло вроде и так.
А ларчик просто открывался:
Разница в том что набор {..$exps}; помещается в блок соответственно декларация generated_code_array из вне не видна. поэтому WriteLine( $(generated_code_array : name)[0]);] не найдет символ и выдаст ошибку.