Вопросы по макросам
От: chudo19  
Дата: 04.08.06 10:15
Оценка:
вот макрос
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
Re: Вопросы по макросам
От: Oyster Украина https://github.com/devoyster
Дата: 04.08.06 11:39
Оценка:
Здравствуйте, chudo19, Вы писали:

C>вот использование

C>test(1,2,3); — работает

C>mutable t:int = 7;

C>test (1,2,t); а такое уже не работает. а почему ?

Потому что объявление параметра макроса как "n : int" означает, что передаваться должна обязательно именно целочисленная константа и ничто иное. Т.е. для твоей переменной заработает где-то вот такой макрос:

macro test(i, m : int, n)
{
    <[
        def loop()
        { 
            WriteLine(System.Convert.ToString($n));
        }
        loop()
    ]>
}

— так как запись "$(n : int)" тоже означает, что в AST должна вставиться константа, а у тебя на руках только имя переменной.

C>И еще вопрос: есть у меня локально объявленный масив . как его запихнуть в нутрь <[...]>.

C>тоетсть мне нужно как то сгенерить объявление масива и чтоб его содержимое стало равным моему.

Пример кода хоть какого-то или поподробней объясни, что ты хочешь.
Re[2]: Вопросы по макросам
От: chudo19  
Дата: 04.08.06 11:56
Оценка:
Здравствуйте, Oyster, Вы писали:


C>>И еще вопрос: есть у меня локально объявленный масив . как его запихнуть в нутрь <[...]>.

C>>тоетсть мне нужно как то сгенерить объявление масива и чтоб его содержимое стало равным моему.

O>Пример кода хоть какого-то или поподробней объясни, что ты хочешь.



Пример
macro()
{
mutable compile_time_array:array[int] = GenerateSomeArray();


<[
mutable generated_code_array:array[int];

как проинициализировать generated_code_array тем что в compile_time_array

]>
}
Re[3]: Вопросы по макросам
От: Oyster Украина https://github.com/devoyster
Дата: 04.08.06 12:25
Оценка:
Здравствуйте, chudo19, Вы писали:

C>как проинициализировать generated_code_array тем что в compile_time_array


Пожалуй, как-то так:

using Nemerle.Utility;

macro InitArray()
{
    mutable compile_time_array : array[int] = GenerateSomeArray();
    def vals = NArray.ToList().Map(compile_time_array, i => <[ $(i : int) ]>);
    <[ mutable generated_code_array : array[int] = array[ .. $vals ]; ]>
}

Собственно, курим мануал: http://nemerle.org/Macros_tutorial#Constructs_with_variable_amount_of_elements
Re[4]: Вопросы по макросам
От: chudo19  
Дата: 04.08.06 12:38
Оценка:
Здравствуйте, Oyster, Вы писали:



C>>как проинициализировать generated_code_array тем что в compile_time_array


O>Пожалуй, как-то так:


Спасибо большое.

А почему не работает так?
Я понимаю что так не красиво. Но не понятно что не так.

{
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;
}

<[ {..$exps}; ]>

}

пишет "unbound name _N_1340" про $(generated_code_array:name):
если зделать вместо этого $("bla":dyn) то тоже самое
Re[4]: Вопросы по макросам
От: chudo19  
Дата: 04.08.06 12:46
Оценка:
Здравствуйте, Oyster, Вы писали:

O>Здравствуйте, chudo19, Вы писали:


C>>как проинициализировать generated_code_array тем что в compile_time_array


O>Пожалуй, как-то так:


Эрм... Пример не работает. Помойму та же проблема что и у моего кода
Re[5]: Вопросы по макросам
От: chudo19  
Дата: 04.08.06 12:49
Оценка: +1
C>Эрм... Пример не работает. Помойму та же проблема что и у моего кода

Поправка. работает если переписать так
mutable compile_time_array : array[int] = m_arr;
def vals = compile_time_array.ToList().Map( i => <[ $(i : int) ]>);
<[ mutable generated_code_array : array[int] = array[ .. $vals ]; ]>
Re[5]: Вопросы по макросам
От: Oyster Украина https://github.com/devoyster
Дата: 04.08.06 12:58
Оценка:
Здравствуйте, chudo19, Вы писали:

C>А почему не работает так?


Ну просто потому что это неправильный код. Например, выражение "$(n : name)" ожидает, что у n будет тип Nemerle.Compiler.Parsetree.Name, а у тебя там массив Т.е. ты должен понять, что переменные, которые у тебя в макросе создаются, существуют только на этапе компиляции, и значения из них в AST нужно пропихивать явно.
Re[6]: Вопросы по макросам
От: chudo19  
Дата: 04.08.06 13:24
Оценка:
Здравствуйте, Oyster, Вы писали:


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;
}

<[ {..$exps}; ]>

}
Re[7]: Вопросы по макросам
От: chudo19  
Дата: 04.08.06 13:42
Оценка:
C>Еще раз код :
C>{
C>mutable exps = [];

C>def generated_code_array = Macros.NewSymbol ();


C>exps = <[ mutable $(generated_code_array:name):array[int]= array($(lenArr:int)); ]>::exps;

C>for (mutable k = 0; k < m_arr.Length; k++)
C>{
C>exps = <[$(generated_code_array:name)[$(k:int)] = $(compile_time_array[k]:int) ;]>::exps;
C>}

C><[ {..$exps}; ]>


C>}


Одна ошибка нашлась

exps = <[ mutable $(generated_code_array:name):array[int]= array($(lenArr:int)); ]>::exps;

должен быть после цикла.

теперь такое работает
<[ {..$exps}; ]>

а вот такое нет

<[ {..$exps}; WriteLine( $(generated_code_array : name)[0]);] >

в чем разница,ктонить может объяснить ?
Re[7]: Вопросы по макросам
От: Oyster Украина https://github.com/devoyster
Дата: 04.08.06 13:44
Оценка:
Здравствуйте, chudo19, Вы писали:

C>Ок . Тогда помогите плиз превратить его в правильный. Чтоб переменная связавалась

C>Как сгенерировать объявление и за ним цепочку присваиваний

А чем тебя не устраивает рабочий код
Автор: chudo19
Дата: 04.08.06
(тем более что по другому у тебя не получится по причинам, описанным мной — локальные переменные макроса существуют только на этапе компиляции)?
Re[8]: Вопросы по макросам
От: chudo19  
Дата: 04.08.06 13:51
Оценка:
Здравствуйте, Oyster, Вы писали:
O>А чем тебя не устраивает рабочий код
Автор: chudo19
Дата: 04.08.06
(тем более что по другому у тебя не получится по причинам, описанным мной — локальные переменные макроса существуют только на этапе компиляции)?


Да меня устраивает. Я его и использую.
Просто меня заинтересовало как же все таки собирать выаржение из кусочков в котором надо использовать одну и туже переменную.
В частности вот для примера объявление и заполнение масива.
Re[9]: Вопросы по макросам
От: chudo19  
Дата: 04.08.06 14:02
Оценка:
C>Здравствуйте, Oyster, Вы писали:

И кстати подругому в полне получится

mutable exps = [];
def x = Macros.NewSymbol ();

exps = <[Write($(x : name)[0]) ]>::exps;

for (mutable k = 0; k < m_arr.Length; k++)
{
exps = <[ $(x : name)[$(k:int)] = $(m_arr[k]:int)]>::exps;
}

exps = <[ mutable $(x : name) = array($(lenArr:int)) ]>::exps;

Вот такое работает ( Write($(x : name)[0]) запихнули в список заранее)

<[ {..$exps}; ]>

А вот такое все же нет.

<[ {..$exps}; Write($(x : name)[0] ]>

в чем разница . хоть убей не пойму
Re[8]: Вопросы по макросам
От: Oyster Украина https://github.com/devoyster
Дата: 04.08.06 14:03
Оценка:
Здравствуйте, chudo19, Вы писали:

C>в чем разница,ктонить может объяснить ?


"using System.Console;" не забыл случайно?
Re[10]: Вопросы по макросам
От: Oyster Украина https://github.com/devoyster
Дата: 04.08.06 14:35
Оценка:
Здравствуйте, chudo19, Вы писали:

C>А вот такое все же нет.


C><[ {..$exps}; Write($(x : name)[0] ]>


C>в чем разница . хоть убей не пойму


То, что ты скобочку забыл, чтобы Write закрыть — это просто тут опечатка?
Re[8]: Вопросы по макросам
От: Oyster Украина https://github.com/devoyster
Дата: 04.08.06 14:35
Оценка:
Здравствуйте, chudo19, Вы писали:

C>а вот такое нет


C><[ {..$exps}; WriteLine( $(generated_code_array : name)[0]);] >


C>в чем разница,ктонить может объяснить ?


То, что у тебя в конце ] и > разделены пробелом — это просто тут опечатка?
Re[9]: Вопросы по макросам
От: chudo19  
Дата: 04.08.06 14:54
Оценка:
Здравствуйте, Oyster, Вы писали:

O>То, что у тебя в конце ] и > разделены пробелом — это просто тут опечатка?


да. только тут опечатка.
Re[10]: Вопросы по макросам
От: sandraspb  
Дата: 05.08.06 16:02
Оценка:
Здравствуйте, chudo19, Вы писали:


Да. И мне интересно. В чем разница то?
Re: Вопросы по макросам
От: chudo19  
Дата: 08.08.06 17:18
Оценка:
up
Re[2]: Вопросы по макросам
От: chudo19  
Дата: 09.08.06 15:11
Оценка:
Здравствуйте, chudo19, Вы писали:

C>а вот такое нет


C><[ {..$exps}; WriteLine( $(generated_code_array : name)[0]);] >


C>в чем разница,ктонить может объяснить ?


Чтож поскольку никто не помог — дошло вроде и так.
А ларчик просто открывался:
Разница в том что набор {..$exps}; помещается в блок соответственно декларация generated_code_array из вне не видна. поэтому WriteLine( $(generated_code_array : name)[0]);] не найдет символ и выдаст ошибку.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.