Есть ли способ в немерли получить ссылку на объявление переменной
От: Аноним  
Дата: 28.11.13 07:26
Оценка:
mutable x=1;
writeln(x); // выводит 2
x++;
writeln(x); // выводит 3
changeinit(x, 2); // макрос



должен генерировать


mutable x=2;
writeln(x); // выводит 2
x++;
writeln(x); // выводит 3
Re: Есть ли способ в немерли получить ссылку на объявление переменной
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 28.11.13 07:40
Оценка:
Также как и в C#.
using System.Console;

module M
{
    public ChangeInt(n : ref int, val : int) : void { n = val }
}

mutable x = 1;
WriteLine(x);
M.ChangeInt(ref x, 2);
WriteLine(x);
Ce n'est que pour vous dire ce que je vous dis.
Re[2]: Есть ли способ в немерли получить ссылку на объявление переменной
От: Аноним  
Дата: 28.11.13 07:49
Оценка:
Здравствуйте, Don Reba, Вы писали:

DR>Также как и в C#.

using System.Console;

module M
{
    public ChangeInt(n : ref int, val : int) : void { n = val }
}

mutable x = 1;
WriteLine(x); // здесь x=1, а мне надо 2, я меняю инициализацию переменной!
M.ChangeInt(ref x, 2); // подмена должна происходить не в данной строчке, а в инициализации!!!
WriteLine(x); // здесь должно быть 2


Не так.
Re[3]: Есть ли способ в немерли получить ссылку на объявление переменной
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 28.11.13 08:02
Оценка:
Извиняюсь. Невнимательно прочитал. Не знаю такого способа.
Ce n'est que pour vous dire ce que je vous dis.
Re: Есть ли способ в немерли получить ссылку на объявление переменной
От: hardcase Пират http://nemerle.org
Дата: 28.11.13 14:36
Оценка:
Здравствуйте, Аноним, Вы писали:

Ссылку получить нельзя, нужно заниматься поиском объявления известной переменной и переписывать PExpr на всю глубину.
Возникает вопрос — какую задачу уважаемый аноним пытается решить таким замысловатым способом?
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Есть ли способ в немерли получить ссылку на объявление переменной
От: Аноним  
Дата: 28.11.13 14:37
Оценка:
Здравствуйте, hardcase, Вы писали:

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


H>Ссылку получить нельзя, нужно заниматься поиском объявления известной переменной и переписывать PExpr на всю глубину.

H>Возникает вопрос — какую задачу уважаемый аноним пытается решить таким замысловатым способом?

Поставить обработчик на изменение переменной.
При изменении выдавать в консоль номер строки и значение.
Re[3]: Есть ли способ в немерли получить ссылку на объявление переменной
От: ionoy Эстония www.ammyui.com
Дата: 28.11.13 16:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Поставить обработчик на изменение переменной.

А>При изменении выдавать в консоль номер строки и значение.

Если переменная всегда объявляется в той же функции ( mutable x = y ), и изменение происходит в этой же функции ( x = z ), то я бы поступил так:
Пишем обходчик кода (пример можно взять отсюда)
В обработчике PExpr.Define запоминаем/отлавливаем нужные переменные, а в обработчике PExpr.Assign возвращаем вместо:

PExpr.Assign(walker(e1), walker(e2))


вот такой код:

PExpr.Sequence([PExpr.Assign(walker(e1), walker(e2)), <[ Console.WriteLine($e2) ]>])


Такой вариант будет работать в простых случаях. Но если ваши объявления/изменения спрятаны в макросах, или тем более в других методах, то этим способом отследить изменения не получится.
Второй поинт в том, что желательно разбирать типизированное дерево (TExpr) на стадии WithTypedMembers. На этом этапе уже будут раскрыты все макросы и сложные конструкции. Пример обходчика для TExpr можно подсмотреть здесь.
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.