mini-mes: Update display_.

* doc/examples/mini-mes.c (display_): Add separator, nicer recursion.
* mes.c (display_): Update.
This commit is contained in:
Jan Nieuwenhuizen 2017-03-22 07:09:58 +01:00
parent 76f6fdc43e
commit efc02d9746
2 changed files with 96 additions and 37 deletions

89
mes.c
View File

@ -1024,63 +1024,91 @@ string_to_cstring (SCM s)
return buf; return buf;
} }
int g_depth;
#define gputs(x) fputs(x, stdout)
SCM SCM
display_ (SCM x) display_helper (SCM x, int cont, char* sep)
{ {
gputs (sep);
if (g_depth == 0) return cell_unspecified;
//FIXME:
//g_depth--;
g_depth = g_depth - 1;
// eputs ("<display>\n"); // eputs ("<display>\n");
switch (TYPE (x)) switch (TYPE (x))
{ {
case TCHAR: case TCHAR:
{ {
//fputs ("<char>\n", stdout); //puts ("<char>\n");
fputs ("#\\", stdout); gputs ("#\\");
putchar (VALUE (x)); putchar (VALUE (x));
break; break;
} }
case TFUNCTION: case TFUNCTION:
{ {
fputs ("#<procedure ", stdout); gputs ("#<procedure ");
///fputs (FUNCTION (x).name ? FUNCTION (x).name : "?", stdout); ///gputs (FUNCTION (x).name ? FUNCTION (x).name : "?");
char *p = "?"; char *p = "?";
if (FUNCTION (x).name != 0) if (FUNCTION (x).name != 0)
p = FUNCTION (x).name; p = FUNCTION (x).name;
fputs (p, stdout); gputs (p);
fputs ("[", stdout); gputs ("[");
fputs (itoa (CDR (x)), stdout); gputs (itoa (CDR (x)));
fputs ("]>", stdout); gputs (",");
gputs (itoa (x));
gputs ("]>");
break; break;
} }
case TMACRO: case TMACRO:
{ {
fputs ("#<macro ", 1); gputs ("#<macro ");
display_ (cdr (x)); display_helper (cdr (x), cont, "");
fputs (">", 1); gputs (">");
break; break;
} }
case TNUMBER: case TNUMBER:
{ {
//fputs ("<number>\n", stdout); //gputs ("<number>\n");
fputs (itoa (VALUE (x)), stdout); gputs (itoa (VALUE (x)));
break; break;
} }
case TPAIR: case TPAIR:
{ {
//fputs ("<pair>\n", stdout); if (!cont) gputs ("(");
//if (cont != cell_f) fputs ("(", stdout);
fputs ("(", stdout);
if (x && x != cell_nil) display_ (CAR (x)); if (x && x != cell_nil) display_ (CAR (x));
if (CDR (x) && CDR (x) != cell_nil) if (CDR (x) && TYPE (CDR (x)) == TPAIR)
display_helper (CDR (x), 1, " ");
else if (CDR (x) && CDR (x) != cell_nil)
{ {
if (TYPE (CDR (x)) != TPAIR) if (TYPE (CDR (x)) != TPAIR)
fputs (" . ", stdout); gputs (" . ");
display_ (CDR (x)); display_ (CDR (x));
} }
//if (cont != cell_f) fputs (")", stdout); if (!cont) gputs (")");
fputs (")", stdout);
break; break;
} }
case TSPECIAL: case TSPECIAL:
#if __NYACC__
// FIXME
//{}
{
SCM t = CAR (x);
while (t && t != cell_nil)
{
putchar (VALUE (CAR (t)));
t = CDR (t);
}
break;
}
#endif
case TSTRING: case TSTRING:
#if __NYACC__
// FIXME
{}
#endif
case TSYMBOL: case TSYMBOL:
{ {
SCM t = CAR (x); SCM t = CAR (x);
@ -1093,18 +1121,25 @@ display_ (SCM x)
} }
default: default:
{ {
//fputs ("<default>\n", stdout); //gputs ("<default>\n");
fputs ("<", stdout); gputs ("<");
fputs (itoa (TYPE (x)), stdout); gputs (itoa (TYPE (x)));
fputs (":", stdout); gputs (":");
fputs (itoa (x), stdout); gputs (itoa (x));
fputs (">", stdout); gputs (">");
break; break;
} }
} }
return 0; return 0;
} }
SCM
display_ (SCM x)
{
g_depth = 5;
return display_helper (x, 0, "");
}
SCM SCM
stderr_ (SCM x) stderr_ (SCM x)
{ {

View File

@ -66,7 +66,6 @@ struct scm {
SCM cdr; SCM cdr;
}; };
typedef int (*f_t) (void);
struct function { struct function {
int (*function) (void); int (*function) (void);
int arity; int arity;
@ -1131,9 +1130,17 @@ write_byte (SCM x) ///((arity . n))
return c; return c;
} }
int g_depth;
SCM SCM
display_ (SCM x) display_helper (SCM x, int cont, char* sep)
{ {
puts (sep);
if (g_depth == 0) return cell_unspecified;
//FIXME:
//g_depth--;
g_depth = g_depth - 1;
// eputs ("<display>\n"); // eputs ("<display>\n");
switch (TYPE (x)) switch (TYPE (x))
{ {
@ -1154,13 +1161,15 @@ display_ (SCM x)
puts (p); puts (p);
puts ("["); puts ("[");
puts (itoa (CDR (x))); puts (itoa (CDR (x)));
puts (",");
puts (itoa (x));
puts ("]>"); puts ("]>");
break; break;
} }
case TMACRO: case TMACRO:
{ {
puts ("#<macro "); puts ("#<macro ");
display_ (cdr (x)); display_helper (cdr (x), cont, "");
puts (">"); puts (">");
break; break;
} }
@ -1172,24 +1181,32 @@ display_ (SCM x)
} }
case TPAIR: case TPAIR:
{ {
//puts ("<pair>\n"); if (!cont) puts ("(");
//if (cont != cell_f) puts "(");
puts ("(");
if (x && x != cell_nil) display_ (CAR (x)); if (x && x != cell_nil) display_ (CAR (x));
if (CDR (x) && CDR (x) != cell_nil) if (CDR (x) && TYPE (CDR (x)) == TPAIR)
display_helper (CDR (x), 1, " ");
else if (CDR (x) && CDR (x) != cell_nil)
{ {
if (TYPE (CDR (x)) != TPAIR) if (TYPE (CDR (x)) != TPAIR)
puts (" . "); puts (" . ");
display_ (CDR (x)); display_ (CDR (x));
} }
//if (cont != cell_f) puts (")"); if (!cont) puts (")");
puts (")");
break; break;
} }
case TSPECIAL: case TSPECIAL:
#if __NYACC__ #if __NYACC__
// FIXME // FIXME
{} //{}
{
SCM t = CAR (x);
while (t && t != cell_nil)
{
putchar (VALUE (CAR (t)));
t = CDR (t);
}
break;
}
#endif #endif
case TSTRING: case TSTRING:
#if __NYACC__ #if __NYACC__
@ -1220,6 +1237,13 @@ display_ (SCM x)
return 0; return 0;
} }
SCM
display_ (SCM x)
{
g_depth = 5;
return display_helper (x, 0, "");
}
// Jam Collector // Jam Collector
SCM g_symbol_max; SCM g_symbol_max;