As already mentioned earlier, external predicates can also be suspended. The macro
is used to mark a variable which is not instantiated and therefore responsible for suspending a call. var is a pointer to the variable. If this macro is used in a normal external predicate which itself will delay, it must return to the system using the macroMark_Suspending_Variable(var)
Delay
For example, we could define a predicate atomd/1 which is like atom/1 but instead of failing it delays if its argument is not instantiated:
p_atomd(v1, t1)
value v1;
type t1;
{
if (IsRef(t1))
{
Mark_Suspending_Variable(v1.ptr);
Delay;
}
else
Succeed_If(IsAtom(t1));
}