Next: 2.5 手続きの定義
Up: 2 Lispインタプリタの構造
Previous: 2.3.6 ユーザ定義関数の評価
出力は以下のように,式を表示した後改行するという
ことを行なっています.
/* 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日