private int CompileGoalRecord(PrologCodeTerm term, int index)
{
ArrayList recs = new ArrayList();
int nRecs = 0;
ArrayList arguments = new ArrayList();
if (term is PrologCodeNonEmptyList)
{
PrologCodeNonEmptyList NEList = (PrologCodeNonEmptyList)term;
arguments.Add(NEList.Head);
arguments.Add(NEList.Tail);
}
else if (term is PrologCodePredicate)
{
arguments = ((PrologCodePredicate)term).Arguments;
}
for (int i = 0; i < arguments.Count; i++)
{
PrologCodeTerm r = (PrologCodeTerm)arguments[i];
if (r is PrologCodeNonEmptyList || r is PrologCodePredicate)
{
nRecs = recs.Add(CompileGoalRecord(r, -1));
}
}
if (index == -1)
{
index = PrologRegisterTable.Instance.FindRegister();
}
if (term is PrologCodeNonEmptyList)
{
_generator.Emit(OpCodes.Put_List, X(index));
}
else if(term is PrologCodePredicate)
{
PrologCodePredicate s = (PrologCodePredicate)term;
_generator.Emit(OpCodes.Put_Structure, s.Name + "/" + s.Arity, X(index));
}
nRecs = 0;
for (int i = 0; i < arguments.Count; i++)
{
PrologCodeTerm t = (PrologCodeTerm)arguments[i];
if (t is PrologCodeNilAtom || t is PrologCodeEmptyList)
{
_generator.Emit(OpCodes.Set_Constant, "[]");
}
else if (t is PrologCodeAtom)
{
if (t is PrologCodeConstantAtom)
{
_generator.Emit(OpCodes.Set_Constant, ((PrologCodeConstantAtom)t).Value);
}
else if (t is PrologCodeStringAtom)
{
_generator.Emit(OpCodes.Set_Constant, ((PrologCodeStringAtom)t).Value);
}
else if (t is PrologCodeIntegerAtom)
{
_generator.Emit(OpCodes.Set_Constant, ((PrologCodeIntegerAtom)t).Value.ToString());
}
else if (t is PrologCodeFloatAtom)
{
_generator.Emit(OpCodes.Set_Constant, ((PrologCodeFloatAtom)t).Value.ToString());
}
}
else if (t is PrologCodeVariable)
{
/* Compile Goal record variable */
CompileGoalRecordVariable((PrologCodeVariable)t);
}
else if (t is PrologCodePredicate || t is PrologCodeNonEmptyList)
{
_generator.Emit(OpCodes.Set_Value, X((int)recs[nRecs]));
PrologRegisterTable.Instance.FreeRegister((int)recs[nRecs]);
nRecs++;
}
}
return index;
}