mutable x=1;
writeln(x); // выводит 2
x++;
writeln(x); // выводит 3
changeinit(x, 2); // макрос
должен генерировать
mutable x=2;
writeln(x); // выводит 2
x++;
writeln(x); // выводит 3
Также как и в 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);
Здравствуйте, 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
Не так.
Извиняюсь. Невнимательно прочитал. Не знаю такого способа.
Здравствуйте, Аноним, Вы писали:
А>Поставить обработчик на изменение переменной.
А>При изменении выдавать в консоль номер строки и значение.
Если переменная всегда объявляется в той же функции ( 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 можно подсмотреть
здесь.