public Execute ( AbstractMachineState state ) : void | ||
state | AbstractMachineState | |
return | void |
public override void Execute(AbstractMachineState state)
{
AMProgram program = (AMProgram)state.Program;
AMHeap heap = (AMHeap)state.DataArea;
AbstractTerm Ai = ((AbstractTerm)state[_ai]).Dereference();
if (Ai.IsReference)
{
heap.Push(new StructureTerm(_structureName, _arity));
Ai.Bind((AbstractTerm)heap.Top());
state.IsWriteMode = true;
}
else if (Ai.IsStructure)
{
if (Ai.Name == _structureName)
{
// set S to next item on heap
state.S = Ai.Next;
// set read mode
state.IsReadMode = true;
}
else
{
state.Fail = true;
}
}
else
{
state.Fail = true;
}
if (state.Fail)
{
state.Backtrack();
}
else
{
program.Next();
}
}
public void GetStructure() { AbstractMachineState state = SetupMachine(); GetStructureInstruction i = new GetStructureInstruction(); object[] args = { "s/2", "X0" }; i.Process(args); i.Execute(state); Assert.AreEqual("get_structure", i.Name()); Assert.AreEqual(2, i.NumberOfArguments()); AbstractTerm X0 = ((AbstractTerm)state["X0"]).Dereference(); Assert.AreEqual("s", X0.Name); Assert.AreEqual(2, X0.Arity); }