/**************************************************************************** * Writing out a bound variable * ****************************************************************************/ static void PRINT_writeBVar(WordPtr outStream, DF_TermPtr tmPtr) { int i; int bvind = DF_bvIndex(tmPtr); PRINT_BVList lbvs = PRINT_bvs; for (i = bvind; ((i != 1) && lbvs) ; i--) lbvs = lbvs->next; // Is this checking and the else branch really necessary? // Printing should start from top-level closed terms? if (lbvs) STREAM_printf(outStream, "%s", MCSTR_toCString(DF_strDataValue(lbvs->name))); else STREAM_printf(outStream, "#%d", i); }
/* (weak) head normalize bound variable or implicit suspension with bound variable as term skeleton. */ static DF_TermPtr HN_hnormBV(DF_TermPtr bvPtr, Boolean whnf) { DF_TermPtr rtPtr; //term pointer to be returned if (HN_isEmptyEnv()){ //[|#i, 0, 0, nil|] -> #i rtPtr = bvPtr; HNL_setRegsRig(bvPtr); } else { //non-empty env int dbind = DF_bvIndex(bvPtr); if (dbind > ol) { //[|#i,ol,nl,e|] -> #i-ol+nl int newind = dbind - ol + nl; AM_embedError(newind); rtPtr =(DF_TermPtr)AM_hreg; HNL_pushBV(newind); HNL_setRegsRig(rtPtr); HN_setEmptyEnv(); } else { // i <= ol DF_EnvPtr envitem = DF_envListNth(envlist, dbind); int nladj = nl-DF_envIndex(envitem); if (DF_isDummyEnv(envitem)){ //[|#i,ol,nl,..@l..|]->#(nl-l) rtPtr = (DF_TermPtr)AM_hreg; HNL_pushBV(nladj); HNL_setRegsRig(rtPtr); HN_setEmptyEnv(); } else { //pair env [|#i,ol,nl,..(s,l)..|] -> [|s,0,(nl-l),nil|] DF_TermPtr tmPtr = DF_termDeref(DF_envPairTerm(envitem)); if ((nladj != 0) && (DF_isSusp(tmPtr))) {//combine susp int newnl = DF_suspNL(tmPtr)+nladj; AM_embedError(newnl); HN_setEnv(DF_suspOL(tmPtr), newnl, DF_suspEnv(tmPtr)); rtPtr = HN_hnormDispatch(DF_suspTermSkel(tmPtr), whnf); } else { HN_setEnv(0, nladj, DF_EMPTY_ENV); rtPtr = HN_hnormDispatch(tmPtr, whnf); } } //pair env } // i<= ol } //non-empty env return rtPtr; }