static malValuePtr readForm(Tokeniser& tokeniser) { MAL_CHECK(!tokeniser.eof(), "expected form, got EOF"); String token = tokeniser.peek(); MAL_CHECK(!std::regex_match(token, closeRegex), "unexpected '%s'", token.c_str()); if (token == "(") { tokeniser.next(); std::unique_ptr<malValueVec> items(new malValueVec); readList(tokeniser, items.get(), ")"); return mal::list(items.release()); } if (token == "[") { tokeniser.next(); std::unique_ptr<malValueVec> items(new malValueVec); readList(tokeniser, items.get(), "]"); return mal::vector(items.release()); } if (token == "{") { tokeniser.next(); malValueVec items; readList(tokeniser, &items, "}"); return mal::hash(items.begin(), items.end(), false); } return readAtom(tokeniser); }
static void readList(Tokeniser& tokeniser, malValueVec* items, const String& end) { while (1) { MAL_CHECK(!tokeniser.eof(), "expected '%s', got EOF", end.c_str()); if (tokeniser.peek() == end) { tokeniser.next(); return; } items->push_back(readForm(tokeniser)); } }