Esempio n. 1
0
static DF_TermPtr HN_hnormDispatchOcc(DF_TermPtr tmPtr, Boolean whnf)
{
  restart_hnormOcc:
    switch (DF_termTag(tmPtr)){
    case DF_TM_TAG_VAR: 
    {
        if (!HN_isEmptyEnv()) HN_setEmptyEnv();
        HNL_setRegsFlex(tmPtr);
        return tmPtr;
    }
    case DF_TM_TAG_CONST:
    case DF_TM_TAG_INT:
    case DF_TM_TAG_FLOAT:
    case DF_TM_TAG_NIL:
    case DF_TM_TAG_STR:
    case DF_TM_TAG_STREAM:
    {
        if (!HN_isEmptyEnv()) HN_setEmptyEnv();
        HNL_setRegsRig(tmPtr);
        return tmPtr;
    }
    case DF_TM_TAG_BVAR:     { return HN_hnormBVOcc(tmPtr, whnf);           }
    case DF_TM_TAG_CONS:     { return HN_hnormConsOcc(tmPtr, whnf);         }
    case DF_TM_TAG_LAM:      { return HN_hnormLamOcc(tmPtr, whnf);          }
    case DF_TM_TAG_APP:      {
        if (AM_vbbreg == tmPtr) EM_THROW(EM_FAIL);
        return HN_hnormAppOcc(tmPtr, whnf);          }
    case DF_TM_TAG_SUSP:     { return HN_hnormSuspOcc(tmPtr, whnf);         }
    case DF_TM_TAG_REF:      {tmPtr=DF_termDeref(tmPtr); goto restart_hnormOcc;}
    }

    //Impossible to reach this point.
    return NULL;
}
Esempio n. 2
0
/****************************************************************************
 * Writing out a non-empty list.                                            *
 ****************************************************************************/
static void PRINT_writeCons(WordPtr outStream, DF_TermPtr tmPtr, 
                            OP_FixityType fx, int prec, OP_TermContext tc)
{
    DF_TermPtr    args     = DF_consArgs(tmPtr);
    DF_TermPtr    arg;
    OP_FixityType consfix  = (OP_FixityType)AM_cstFixity(PERV_CONS_INDEX);
    int           consprec = AM_cstPrecedence(PERV_CONS_INDEX);
    Boolean       pparen   = PRINT_parenNeeded(consfix, consprec, tc, fx,prec);

    if (pparen) PRINT_writeLParen(outStream);
    PRINT_writeTerm(outStream, args, consfix, consprec, OP_LEFT_TERM);    
    PRINT_writeConsSymbol(outStream);
    
    do {
        args++;
        tmPtr = DF_termDeref(args);
        if (DF_termTag(tmPtr) != DF_TM_TAG_CONS) break;
        args = DF_consArgs(tmPtr);
        PRINT_writeTerm(outStream, args, consfix, consprec, OP_LEFT_TERM);
        PRINT_writeConsSymbol(outStream);
    } while(1);
    
    PRINT_writeTerm(outStream, tmPtr, consfix, consprec, OP_RIGHT_TERM);
    if (pparen) PRINT_writeRParen(outStream);
}
Esempio n. 3
0
static DF_TermPtr HN_lnormDispatch(DF_TermPtr tmPtr, Boolean whnf)
{
  restart_lnorm:
    switch (DF_termTag(tmPtr)){
    case DF_TM_TAG_VAR: 
    {
        if (!HN_isEmptyEnv()) HN_setEmptyEnv();
        HNL_setRegsFlex(tmPtr);
        return tmPtr;
    }
    case DF_TM_TAG_CONST:
    case DF_TM_TAG_INT:
    case DF_TM_TAG_FLOAT:
    case DF_TM_TAG_NIL:
    case DF_TM_TAG_STR:
    case DF_TM_TAG_STREAM:
    {
        if (!HN_isEmptyEnv()) HN_setEmptyEnv();
        HNL_setRegsRig(tmPtr);
        return tmPtr;
    }
    case DF_TM_TAG_BVAR:     { return HN_lnormBV(tmPtr, whnf);           }
    case DF_TM_TAG_CONS:     { return HN_lnormCons(tmPtr, whnf);         }
    case DF_TM_TAG_LAM:      { return HN_lnormLam(tmPtr, whnf);          }
    case DF_TM_TAG_APP:      { return HN_lnormApp(tmPtr, whnf);          }
    case DF_TM_TAG_SUSP:     { return HN_lnormSusp(tmPtr, whnf);         }
    case DF_TM_TAG_REF:      { tmPtr = DF_termDeref(tmPtr); goto restart_lnorm;}
    }

    //Impossible to reach this point.
    return NULL;
}
Esempio n. 4
0
/*****************************************************************************
 * The main routine for writing out a term; this is called by the interface  *
 * routines to do the real job of printing.                                  *
 *****************************************************************************/
static void PRINT_writeTerm(WordPtr outStream, DF_TermPtr tmPtr, 
                            OP_FixityType infx, int inprec, OP_TermContext tc)
{
    tmPtr = DF_termDeref(tmPtr);
    switch (DF_termTag(tmPtr)) {
    case DF_TM_TAG_INT:     PRINT_writeInt(outStream, tmPtr);    break;
    case DF_TM_TAG_FLOAT:   PRINT_writeFloat(outStream, tmPtr);  break;
    case DF_TM_TAG_STR:     PRINT_writeString(outStream, tmPtr); break;
    case DF_TM_TAG_STREAM:  PRINT_writeStream(outStream, tmPtr); break;
    case DF_TM_TAG_CONST:   PRINT_writeConst(outStream, tmPtr);  break;
    case DF_TM_TAG_VAR:     PRINT_writeFVar(outStream, tmPtr);   break;
    case DF_TM_TAG_BVAR:    PRINT_writeBVar(outStream, tmPtr);   break;
    case DF_TM_TAG_NIL:     PRINT_writeNil(outStream);           break;
    case DF_TM_TAG_CONS:    
        PRINT_writeCons(outStream, tmPtr, infx, inprec, tc);     break;
    case DF_TM_TAG_LAM:     
        PRINT_writeAbst(outStream, tmPtr, infx, inprec, tc);     break;
    case DF_TM_TAG_APP:
        PRINT_writeApp(outStream, tmPtr, infx, inprec, tc);      break;
    } /* switch */    
}
Esempio n. 5
0
/* Getting the fixity and precedence for the head of an application. 
   Assume the pointer to the term head is already dereferenced. */
static void PRINT_getHeadInfo(DF_TermPtr hdPtr, OP_FixityType *fx, int* prec)
{
    int cstInd;
    switch (DF_termTag(hdPtr)) {
    case DF_TM_TAG_CONST:
        cstInd = DF_constTabIndex(hdPtr);
        if (AM_cstName(cstInd)) {
            *fx   = (OP_FixityType)AM_cstFixity(cstInd);
            *prec = AM_cstPrecedence(cstInd);
        } else {
            *fx   = OP_NONE;
            *prec = 0;
        }
        break;
    case DF_TM_TAG_VAR:
        *fx   = OP_NONE;
        *prec = OP_MINPREC;
        break;
    case DF_TM_TAG_BVAR:
        *fx   = OP_NONE;
        *prec = OP_MINPREC;
        break;
    }
}