Ejemplo n.º 1
0
        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;
            }
        }
Ejemplo n.º 2
0
        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;
            }
        }
Ejemplo n.º 3
0
        // 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);
            }
        }
Ejemplo n.º 4
0
        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;
            }
        }