/* parse.c 720d */ Explist parselist(Parlist pl) { Exp e; if (pl == NULL) return NULL; e = parseexp(pl->hd); return mkEL(e, parselist(pl->tl)); }
/* * Now we can move on to parsing [[Exp]]s. The * [[parselist]] helper function repeatedly calls * [[parseexp]] to parse a list of [[Par]] expressions, * eventually returning a list of [[Exp]]s. * <parse.c>= */ static Explist parselist(Parlist pl) { Exp e; if (pl == NULL) return NULL; e = parseexp(pl->hd); /* force pl->hd to be parsed first */ return mkEL(e, parselist(pl->tl)); }
/* parse.c 723c */ static void parseletbindings(Par p, Parlist bindings, Exp letexp) { if (bindings) { Par t = bindings->hd; Name n; /* name bound in t (if t is well formed) */ Exp e; /* expression on RHS of t (if t is well formed) */ parseletbindings(p, bindings->tl, letexp); if (t->alt != LIST || lengthPL(t->u.list) != 2 || nthPL(t->u.list, 0)->alt != ATOM) error("%p: usage: (letX (letlist) exp)", p); n = nthPL(t->u.list, 0)->u.atom; e = parseexp(nthPL(t->u.list, 1)); letexp->u.letx.nl = mkNL(n, letexp->u.letx.nl); letexp->u.letx.el = mkEL(e, letexp->u.letx.el); } }