next up previous
Next: 2.5 手続きの定義 Up: 2 Lispインタプリタの構造 Previous: 2.3.6 ユーザ定義関数の評価

2.4 print

出力は以下のように,式を表示した後改行するという ことを行なっています.

/* stdprint - print to *standard-output* */
stdprint(expr)
  LVAL expr;
{
    xlprint(getvalue(s_stdout),expr,TRUE);
    xlterpri(getvalue(s_stdout));
}

/* xlprint - print an xlisp value */
xlprint(fptr,vptr,flag)
  LVAL fptr,vptr; int flag;
{
    LVAL nptr,next;
    int n,i;

    /* print nil */
    if (vptr == NIL) {
        putsymbol(fptr,"NIL",flag);
        return;
    }

    /* check value type */
    switch (ntype(vptr)) {
    case SUBR:
            putsubr(fptr,"Subr",vptr);
            break;
    case FSUBR:
            putsubr(fptr,"FSubr",vptr);
            break;
    case CONS:
            xlputc(fptr,'(');
            for (nptr = vptr; nptr != NIL; nptr = next) {
                xlprint(fptr,car(nptr),flag);
                if (next = cdr(nptr))
                    if (consp(next))
                        xlputc(fptr,' ');
                    else {
                        xlputstr(fptr," . ");
                        xlprint(fptr,next,flag);
                        break;
                    }
            }
            xlputc(fptr,')');
            break;
    case SYMBOL:
            putsymbol(fptr,getstring(getpname(vptr)),flag);
            break;
    case FIXNUM:
            putfixnum(fptr,getfixnum(vptr));
            break;
    case FLONUM:
            putflonum(fptr,getflonum(vptr));
            break;
    case CHAR:
            putchcode(fptr,getchcode(vptr),flag);
            break;
    case STRING:
            if (flag)
                putqstring(fptr,vptr);
            else
                putstring(fptr,vptr);
            break;
    case STREAM:
            putatm(fptr,"File-Stream",vptr);
            break;
    case USTREAM:
            putatm(fptr,"Unnamed-Stream",vptr);
            break;
    case OBJECT:
            putatm(fptr,"Object",vptr);
            break;
    case VECTOR:
            xlputc(fptr,'#'); xlputc(fptr,'(');
            for (i = 0, n = getsize(vptr) - 1; i <= n; ++i) {
                xlprint(fptr,getelement(vptr,i),flag);
                if (i != n) xlputc(fptr,' ');
            }
            xlputc(fptr,')');
            break;
    case STRUCT:
            xlprstruct(fptr,vptr,flag);
            break;
    case CLOSURE:
            putclosure(fptr,vptr);
            break;
    case FREE:
            putatm(fptr,"Free",vptr);
            break;
    default:
            putatm(fptr,"Foo",vptr);
            break;
    }
}

/* xlterpri - terminate the current print line */
xlterpri(fptr)
  LVAL fptr;
{
    xlputc(fptr,'\n');
}


generated through LaTeX2HTML. M.Inaba 平成18年5月6日