INF
{ "unalias", unalias, 1, INF },
{ "unlimit", dounlimit, 0, INF },
{ "unset", unset, 1, INF },
{ "unsetenv", dounsetenv, 1, INF },
{ "which", dowhich, 1, INF },
{ "while", dowhile, 1, INF }
{ "@", dolet, 0, INF },
{ "alias", doalias, 0, INF },
{ "bg", dobg, 0, INF },
{ "cd", dochngd, 0, INF },
{ "chdir", dochngd, 0, INF },
{ "dirs", dodirs, 0, INF },
{ "echo", doecho, 0, INF },
{ "else", doelse, 0, INF },
{ "eval", doeval, 0, INF },
{ "exec", execash, 1, INF },
{ "exit", doexit, 0, INF },
{ "fg", dofg, 0, INF },
{ "foreach", doforeach, 3, INF },
{ "glob", doglob, 0, INF },
{ "if", doif, 1, INF },
{ "kill", dokill, 1, INF },
{ "linedit", doecho, 0, INF },
{ "nice", donice, 0, INF },
{ "nohup", donohup, 0, INF },
{ "notify", donotify, 0, INF },
{ "popd", dopopd, 0, INF },
{ "printf", doprintf, 1, INF },
{ "pushd", dopushd, 0, INF },
{ "repeat", dorepeat, 2, INF },
{ "set", doset, 0, INF },
{ "stop", dostop, 1, INF },
{ "switch", doswitch, 1, INF },
{ "time", dotime, 0, INF },
# define MAP(n) (((n) <= 1) ? (n) : ((n) == INFINITY) ? INF : N)
case REP(0, INF): /* as x{1,}? */
case REP(1, INF): /* as x+ */
case REP(N, INF): /* as xx{n-1,INF} */