public static int FooThree(PlTerm a0, int arity, IntPtr control) { var handle = control; FRG fc = (FRG)(libpl.PL_foreign_control(control)); switch (fc) { case FRG.PL_FIRST_CALL: { var v = NondetContextHandle.ObtainHandle(control); var tv = new PlTermV(a0, arity); bool res = v.Setup(tv); bool more = v.HasMore(); if (more) { libpl.PL_retry(v.Handle); return(res ? 3 : 0); } return(res ? 1 : 0); } break; case FRG.PL_REDO: { var v = NondetContextHandle.FindHandle(control); bool res = v.Call(new PlTermV(a0, arity)); bool more = v.HasMore(); if (more) { libpl.PL_retry(v.Handle); return(res ? 3 : 0); } return(res ? 1 : 0); } break; case FRG.PL_CUTTED: { var v = NondetContextHandle.FindHandle(control); bool res = v.Close(new PlTermV(a0, arity)); NondetContextHandle.ReleaseHandle(v); return(res ? 1 : 0); } break; default: { throw new PlException("no frg"); return(libpl.PL_fail); } break; } }
public int BackrackImpl(PlTerm a0, int arity, IntPtr control) { FRG fc = (FRG)(libpl.PL_foreign_control(control)); ContextHandle handle; switch (fc) { case FRG.PL_FIRST_CALL: { handle = NondetContextHandle.ObtainHandle(control, Clone()); var av = new PlTermV(a0, arity); handle.ManagedObject = New(handle, av); return(Call0(handle, av)); } break; case FRG.PL_REDO: { handle = NondetContextHandle.FindHandle(control); return(Call0(handle, new PlTermV(a0, arity))); } break; case FRG.PL_CUTTED: { handle = NondetContextHandle.FindHandle(control); var av = new PlTermV(a0, arity); bool res = Close(handle, av); NondetContextHandle.ReleaseHandle(handle); return(res ? 1 : 0); } break; default: { throw new PlException("no frg"); return(libpl.PL_fail); } break; } }
// foo(X,Y),writeq(f(X,Y)),nl,X=5. public static int Foo(PlTerm t0, PlTerm term2, IntPtr control) { callNum++; if (callNum > 10) { callNum = 0; //return libpl.PL_fail; } var handle = control; FRG fc = (FRG)(libpl.PL_foreign_control(control)); switch (fc) { case FRG.PL_FIRST_CALL: unsafe { ndtp = new PrologCLR.PinnedObject <NonDetTest>(); ndtp.managedObject.start = 1; ndtp.managedObject.stop = 3; //ndtp.managedObject.fid = libpl.PL_open_foreign_frame(); ndtp.Recopy(); IntPtr ctxt = ndtp.Pointer; goto redo; int succeed = CountTo(t0, term2, ref ndtp.managedObject); if (ndtp.managedObject.start <= ndtp.managedObject.stop) { libpl.PL_retry_address(ctxt); } if (succeed == 0) { return(0); } return(3); } break; case FRG.PL_REDO: unsafe { goto redo; NonDetTest *o = (NonDetTest *)0; IntPtr ctxt = libpl.PL_foreign_context_address(control); if (!ctxt.ToString().Equals("0")) { o = (NonDetTest *)ctxt; } else { o = (NonDetTest *)ndtp.Pointer; } int succeed = CountTo(t0, term2, ref *o); NonDetTest managedObject = *o; if (managedObject.start <= managedObject.stop) { libpl.PL_retry_address(ctxt); if (succeed == 0) { return(0); } return(3); } if (managedObject.fid != 0) { libpl.PL_close_foreign_frame(managedObject.fid); managedObject.fid = 0; } if (succeed == 0) { return(0); } return(1); } break; case FRG.PL_CUTTED: unsafe { NonDetTest *o = (NonDetTest *)0; IntPtr ctxt = libpl.PL_foreign_context_address(control); if (!ctxt.ToString().Equals("0")) { o = (NonDetTest *)ctxt; } else { o = (NonDetTest *)ndtp.Pointer; } NonDetTest managedObject = *o; if (managedObject.fid != 0) { libpl.PL_close_foreign_frame(managedObject.fid); managedObject.fid = 0; } return(libpl.PL_succeed); } break; default: { throw new PlException("no frg"); return(libpl.PL_fail); } break; } redo: unsafe { NonDetTest *o = (NonDetTest *)0; IntPtr ctxt = libpl.PL_foreign_context_address(control); var fc0 = libpl.PL_foreign_context(control); if (!ctxt.ToString().Equals("0")) { o = (NonDetTest *)ctxt; } else { o = (NonDetTest *)ndtp.Pointer; } int succeed = CountTo(t0, term2, ref *o); NonDetTest managedObject = *o; if (managedObject.start <= managedObject.stop) { libpl.PL_retry_address(ctxt); if (succeed == 0) { return(0); } return(3); } if (managedObject.fid != 0) { libpl.PL_close_foreign_frame(managedObject.fid); managedObject.fid = 0; } if (succeed == 0) { return(0); } return(1); } }
public static int cliAddEventHandler0(PlTerm clazzOrInstance, PlTerm memberSpec, PlTerm closureTerm, PlTerm blockOn, IntPtr control) { var handle = control; FRG fc = (FRG)(libpl.PL_foreign_control(control)); switch (fc) { case FRG.PL_FIRST_CALL: { object getInstance; Type c; if (!GetInstanceAndType(clazzOrInstance, out getInstance, out c)) { return(PlSucceedOrFail(false)); } Type[] paramz = null; if (!CheckBound(memberSpec, closureTerm)) { return(PlSucceedOrFail(false)); } EventInfo fi = findEventInfo(memberSpec, c, ref paramz, BindingFlagsALL); if (fi == null) { return(Error("Cant find event {0} on {1}", memberSpec, (object)c ?? clazzOrInstance) ? 3 : 0); } ClosureDelegate newClosureDelegate = new ClosureDelegate(fi, getInstance, closureTerm); var v = NondetContextHandle.ObtainHandle(control, newClosureDelegate); bool res = v.Setup(new PlTermV(closureTerm, blockOn)); blockOn.FromObject(newClosureDelegate); bool more = v.HasMore(); if (more) { libpl.PL_retry(v.Handle); return(res ? 3 : 0); } return(res ? 1 : 0); } break; case FRG.PL_REDO: { var v = NondetContextHandle.FindHandle(control); bool res = v.Call(new PlTermV(closureTerm, blockOn)); bool more = v.HasMore(); if (more) { libpl.PL_retry(v.Handle); return(res ? 3 : 0); } return(res ? 1 : 0); } break; case FRG.PL_CUTTED: { var v = NondetContextHandle.FindHandle(control); bool res = v.Close(new PlTermV(closureTerm, blockOn)); NondetContextHandle.ReleaseHandle(v); return(res ? 1 : 0); } break; default: { throw new PlException("no frg"); return(libpl.PL_fail); } break; } }