예제 #1
0
        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);
        }
예제 #2
0
        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);
        }