- if (c == EOF && w == cell_nil) return cell_nil;
- if (c == '\t') return reader_read_word_ ('\n', w, a);
- if (c == '\f') return reader_read_word_ ('\n', w, a);
- if (c == '\n' && w == cell_nil) return reader_read_word_ (getchar (), w, a);
- if (c == '\n' && VALUE (car (w)) == '.' && cdr (w) == cell_nil) return cell_dot;
- if (c == ' ') return reader_read_word_ ('\n', w, a);
- if (c == EOF || c == '\n') return reader_lookup_ (w, a);
-
- if (c == '(' && w == cell_nil) return reader_read_list (a);
- if (c == '(') {ungetchar (c); return reader_lookup_ (w, a);}
- if (c == ')' && w == cell_nil) {ungetchar (c); return cell_nil;}
- if (c == ')') {ungetchar (c); return reader_lookup_ (w, a);}
- if (c == ';') {reader_read_line_comment (c); return reader_read_word_ ('\n', w, a);}
-
- if (c == '"' && w == cell_nil) return reader_read_string ();
- if (c == '"') {ungetchar (c); return reader_lookup_ (w, a);}
- if (c == ',' && peekchar () == '@') {getchar (); return cons (cell_symbol_unquote_splicing,
- cons (reader_read_word_ (getchar (), w, a),
- cell_nil));}
- if (c == '\'') return cons (cell_symbol_quote, cons (reader_read_word_ (getchar (), w, a), cell_nil));
- if (c == '`') return cons (cell_symbol_quasiquote, cons (reader_read_word_ (getchar (), w, a), cell_nil));
- if (c == ',') return cons (cell_symbol_unquote, cons (reader_read_word_ (getchar (), w, a), cell_nil));
-
- if (c == '#' && peekchar () == '!') {c = getchar (); reader_read_block_comment (c, getchar ()); return reader_read_word_ (getchar (), w, a);}
- if (c == '#' && peekchar () == '|') {c = getchar (); reader_read_block_comment (c, getchar ()); return reader_read_word_ (getchar (), w, a);}
- if (c == '#' && peekchar () == 'f') return reader_read_word_ (getchar (), append2 (w, cons (MAKE_CHAR (c), cell_nil)), a);
- if (c == '#' && peekchar () == 't') return reader_read_word_ (getchar (), append2 (w, cons (MAKE_CHAR (c), cell_nil)), a);
- if (c == '#') return read_hash (getchar (), w, a);
-
- return reader_read_word_ (getchar (), append2 (w, cons (MAKE_CHAR (c), cell_nil)), a);
+ switch (c)
+ {
+ case ' ':
+ return reader_read_sexp_ ('\n', s, a);
+ case '\f':
+ return reader_read_sexp_ ('\n', s, a);
+ case '\t':
+ return reader_read_sexp_ ('\n', s, a);
+ case '\'':
+ return cons (cell_symbol_quote,
+ cons (reader_read_sexp_ (getchar (), s, a), cell_nil));
+ case ';':
+ reader_read_line_comment (c);
+ return reader_read_sexp_ ('\n', s, a);
+ case '#':
+ return read_hash (getchar (), s, a);
+ case '`':
+ return cons (cell_symbol_quasiquote,
+ cons (reader_read_sexp_ (getchar (), s, a), cell_nil));
+ case ',':
+ if (peekchar () == '@')
+ {
+ getchar ();
+ return cons (cell_symbol_unquote_splicing,
+ cons (reader_read_sexp_ (getchar (), s, a), cell_nil));
+ }
+ return cons (cell_symbol_unquote,
+ cons (reader_read_sexp_ (getchar (), s, a), cell_nil));
+ default:
+ if (s == cell_nil)
+ switch (c)
+ {
+ case EOF:
+ return cell_nil;
+ case '\n':
+ return reader_read_sexp_ (getchar (), s, a);
+ case '(':
+ return reader_read_list (getchar (), a);
+ case ')':
+ ungetchar (c);
+ return cell_nil;
+ case '"':
+ return reader_read_string ();
+ }
+ else
+ switch (c)
+ {
+ case EOF:
+ return reader_lookup_ (s, a);
+ case '\n':
+ if (CAR (s) == cell_dot && CDR (s) == cell_nil)
+ return cell_dot;
+ else
+ return reader_lookup_ (s, a);
+ case '(':
+ ungetchar (c);
+ return reader_lookup_ (s, a);
+ case ')':
+ ungetchar (c);
+ return reader_lookup_ (s, a);
+ case '"':
+ ungetchar (c);
+ return reader_lookup_ (s, a);
+ }
+ }
+ return reader_read_sexp_ (getchar (),
+ append2 (s, cons (MAKE_CHAR (c), cell_nil)), a);