我asked a question earlier,但我不认为我对我希望的那种答案足够清楚,所以让我提供一个更具体的例子:
class Program
{
private static bool State;
static void Main(string[] args)
{
State = false;
Console.WriteLine(And());
Console.ReadLine();
}
static bool And()
{
return Or() && C();
}
static bool Or()
{
return A() || AB();
}
static bool C()
{
return State;
}
static bool A()
{
return true;
}
static bool AB()
{
State = true;
return true;
}
}
该程序的流程如下:
现在如果Or()没有执行延迟评估(我将||
更改为|
),程序将返回true。但是,我不希望执行AB(),除非整个解析的结果失败(And()返回false)。
所以我想做的是,在Or()函数中的某个地方,将当前状态保存在堆栈上(静态变量),这样如果And()返回false,我可以弹出一个项目堆叠并尝试替代方案。
我如何在C#中实现这一目标?
答案 0 :(得分:2)
问题与||无关运营商。问题是你忘了在失败的Parse上回溯。如果Parse返回false,则需要将i
和任何其他状态变量恢复为其原始值,以便下一个解析器可以尝试。 C#不是一门追求目标的语言。如果你想要回溯,你必须自己做。 (或转换为带有回溯的语言,如Prolog。)
答案 1 :(得分:1)
让我感到非常琐碎 - 只需重新安排电话:
static void Main(string[] args)
{
State = false;
Console.WriteLine(Or());
Console.ReadLine();
}
static bool Or()
{
return A() && C() || AB() && C();
}
或者我错过了什么?也许C()
有副作用,不应该被调用两次?