public static MalVal read_form(Reader rdr) { string token = rdr.peek(); if (token == null) { throw new MalContinue(); } MalVal form = null; switch (token) { case "'": rdr.next(); return(new MalList(new MalSymbol("quote"), read_form(rdr))); case "`": rdr.next(); return(new MalList(new MalSymbol("quasiquote"), read_form(rdr))); case "~": rdr.next(); return(new MalList(new MalSymbol("unquote"), read_form(rdr))); case "~@": rdr.next(); return(new MalList(new MalSymbol("splice-unquote"), read_form(rdr))); case "^": rdr.next(); MalVal meta = read_form(rdr); return(new MalList(new MalSymbol("with-meta"), read_form(rdr), meta)); case "@": rdr.next(); return(new MalList(new MalSymbol("deref"), read_form(rdr))); case "(": form = read_list(rdr, new MalList(), '(', ')'); break; case ")": throw new ParseError("unexpected ')'"); case "[": form = read_list(rdr, new MalVector(), '[', ']'); break; case "]": throw new ParseError("unexpected ']'"); case "{": form = read_hash_map(rdr); break; case "}": throw new ParseError("unexpected '}'"); default: form = read_atom(rdr); break; } return(form); }
public static MalVal read_list(Reader rdr, MalList lst, char start, char end) { string token = rdr.next(); if (token[0] != start) { throw new ParseError("expected '" + start + "'"); } while ((token = rdr.peek()) != null && token[0] != end) { lst.conj_BANG(read_form(rdr)); } if (token == null) { throw new ParseError("expected '" + end + "', got EOF"); } rdr.next(); return(lst); }