如何从嵌套块中的外部块访问变量?
How to get access to variables from outer Block in nested one?
我正在尝试使用 C# 扩展树编写一些简单的 brainf*ck 执行程序。
但我无法使循环工作。
我有这样的输入:++++++++++++++++++++[>>+<++<-]>.>.
在 CST 构建之后:
() => {
int index;
LazyDictionary<int, char> lent;
index = 0;
lent = #LazyDictionary<int, char>;
lent[index] = (char)(lent[index] + 20);
while (true) {
if (lent[index] == '') {
break;
} else {
index += (int)2;
lent[index] = (char)(lent[index] + 1);
index -= (int)1;
lent[index] = (char)(lent[index] + 2);
index -= (int)1;
lent[index] = (char)(lent[index] - 1);
}
};
index += (int)1;
Console.Write(lent[index]);
index += (int)1;
Console.Write(lent[index]);
}
看起来应该可以,但问题是变量。
while
循环中的语句是嵌套的 ExpressionBlock
并且任何使用 lent
或 index
都会导致异常,例如:
Variable 'index' of type 'System.Int32' referenced from scope '', but it is not defined
我构建循环的代码是这样的
cstLoopNode.Inner.Visit(this);
var prebody = Buffer.Pop();
var breakLabel = Expression.Label();
var condition = Expression.Equal(CurrentLentValueExpression, Expression.Constant('[=11=]'));
var loopStopper = Expression.IfThenElse(condition, Expression.Break(breakLabel), prebody);
Buffer.Push(Expression.Loop(loopStopper, breakLabel));
变量prebody
包含一个内部语句块。如果我在创建块时添加变量,它会在主体中创建具有相同名称的新变量。如果我不添加它们,我就没有这些变量,并且它无法访问外部块中的变量。
有没有办法创建一个嵌套的语句块,它可以从外部块访问变量?
当您使用 Expression.Block
创建块时,您会提供一个局部变量集合。这些应该在块和任何子块中可见。如果您在遍历之前不知道它们,则必须将所需的变量冒泡到 Block 的声明中。
我正在尝试使用 C# 扩展树编写一些简单的 brainf*ck 执行程序。 但我无法使循环工作。
我有这样的输入:++++++++++++++++++++[>>+<++<-]>.>.
在 CST 构建之后:
() => {
int index;
LazyDictionary<int, char> lent;
index = 0;
lent = #LazyDictionary<int, char>;
lent[index] = (char)(lent[index] + 20);
while (true) {
if (lent[index] == '') {
break;
} else {
index += (int)2;
lent[index] = (char)(lent[index] + 1);
index -= (int)1;
lent[index] = (char)(lent[index] + 2);
index -= (int)1;
lent[index] = (char)(lent[index] - 1);
}
};
index += (int)1;
Console.Write(lent[index]);
index += (int)1;
Console.Write(lent[index]);
}
看起来应该可以,但问题是变量。
while
循环中的语句是嵌套的 ExpressionBlock
并且任何使用 lent
或 index
都会导致异常,例如:
Variable 'index' of type 'System.Int32' referenced from scope '', but it is not defined
我构建循环的代码是这样的
cstLoopNode.Inner.Visit(this);
var prebody = Buffer.Pop();
var breakLabel = Expression.Label();
var condition = Expression.Equal(CurrentLentValueExpression, Expression.Constant('[=11=]'));
var loopStopper = Expression.IfThenElse(condition, Expression.Break(breakLabel), prebody);
Buffer.Push(Expression.Loop(loopStopper, breakLabel));
变量prebody
包含一个内部语句块。如果我在创建块时添加变量,它会在主体中创建具有相同名称的新变量。如果我不添加它们,我就没有这些变量,并且它无法访问外部块中的变量。
有没有办法创建一个嵌套的语句块,它可以从外部块访问变量?
当您使用 Expression.Block
创建块时,您会提供一个局部变量集合。这些应该在块和任何子块中可见。如果您在遍历之前不知道它们,则必须将所需的变量冒泡到 Block 的声明中。