/* R5RS library procedure read * (read) * (read [port]) */ SCM scm_proc_read(FILE *file) { int c = skip_comment_and_space(file); switch (c) { case '(': return read_list(file); case ')': /* List end */ scheme_error("symtax error"); case '[': case ']': scheme_error("unsupport bracket"); case '{': case '}': scheme_error("unsupport brace"); case '|': scheme_error("unsupport bar"); case '#': c = fgetc(file); if ('(' == c) { return read_vector(file); } else { ungetc(c, file); return read_simple_datum(file, '#'); } case '\'': /* Quotation */ return new_cons(SCM_SYMBOL_QUOTE, new_cons(scm_proc_read(file), SCM_NULL)); case '`': /* Quasiquotation */ scheme_error("unsupport quasiquotation"); case ',': /* (Splicing) Uuquotation */ scheme_error("unsupport (splicing) unquotation"); default: return read_simple_datum(file, c); } }
static rsexp read_datum (Reader* reader) { rsexp datum; if (match (reader, TKN_HASH_SEMICOLON)) if (r_failure_p (read_datum (reader))) return R_FAILURE; datum = read_simple_datum (reader); return r_failure_p (datum) ? read_compound_datum (reader) : datum; }