next up previous index
Next: Creating and Decomposing Up: Interface to Externals Previous: Unification and Binding

Creating Compound Terms

  ECLiPSe offers the user the possibility to create compound terms on the global stack   and unify them with Prolog terms. The global stack is the place where the system stores all compound terms   and strings to which Prolog variables are bound (recorded terms, arrays and asserted clauses are stored elsewhere). Care must be taken when manipulating the global stack, since the system has no means of checking the correctness of user's data or data changes. The use of the global stack should therefore be an exception, as most of the compound terms can be much easier manipulated by regular Prolog procedures. The global stack is accessed using the pointer

pword        *TG;
  which points to the global stack top (to the first unused item). The global stack grows towards higher addresses.

CAUTION: Two points must be taken care of when using the global stack, otherwise the integrity of the whole system is no longer guaranteed.

To push items on the global stack, e.g. a structure p(1.25, []) use the following sequence:
pword *pw = TG;                 /* pointer to the structure    */
Push_Struct_Frame(Did("p", 2)); /* allocate 3 pwords and       */
                                /* initialize the functor      */
Make_Float(&pw[1], 3.0);        /* fill in the first argument  */
Make_Nil(&pw[2]);               /* fill in the second argument */
For illustration, here follows the code for the external procedure transform/2 whose input is a structure and whose output argument is unified with a structure which is identical to the input one except that is has one more argument at the end which is a free variable:  
int
p_transform(val1, tag1, val2, tag2)
value             val1, val2;
type              tag1, tag2;
{
    pword     *p = TG;
    word32    did1;       /* the DID of the structure */
    int       arity;      /* its arity */
    int       i;

    /* the first argument must be a structure */
    Check_Structure(tag1);
    /* the second argument must be a structure or a variable */
    Check_Output_Structure(tag2);
    /* val1 points to the functor */
    did1 = val1.ptr->val.did;
    arity = DidArity(did1);
    /* reserve space for the functor and (arity + 1) args */
    Push_Struct_Frame(Did(DidName(did1), arity + 1));
    /* copy the arguments */
    for (i = 1; i <= arity; i++)
    {
        p[i] = val1.ptr[i];
    }
    /* now create the free variable in the last argument */
    Make_Var(&p[arity + 1]);
    /* and unify with the second argument */
    Return_Unify_Structure(val2, tag2, p);
}


next up previous index
Next: Creating and Decomposing Up: Interface to Externals Previous: Unification and Binding



Micha Meier
Mon Mar 4 12:11:45 MET 1996