static void DoLoadDefFile( LispEnvironment& aEnvironment, LispInput* aInput, LispDefFile* def) { LispLocalInput localInput(aEnvironment, aInput); const LispString* eof = aEnvironment.iEndOfFile->String(); const LispString* end = aEnvironment.iListClose->String(); bool endoffile = false; LispTokenizer tok; while (!endoffile) { // Read expression const LispString* token = tok.NextToken(*aEnvironment.CurrentInput(), aEnvironment.HashTable()); // Check for end of file if (token == eof || token == end) { endoffile = true; } // Else evaluate else { LispMultiUserFunction* multiUser = aEnvironment.MultiUserFunction(token); if (multiUser->iFileToOpen != nullptr) { aEnvironment.CurrentOutput() << '[' << *token << "]\n"; if (multiUser->iFileToOpen) throw LispErrDefFileAlreadyChosen(); } multiUser->iFileToOpen = def; def->symbols.insert(token); aEnvironment.Protect(token); } } }
void DoInternalLoad(LispEnvironment& aEnvironment,LispInput* aInput) { LispLocalInput localInput(aEnvironment, aInput); // TODO make "EndOfFile" a global thing // read-parse-eval to the end of file const LispString* eof = aEnvironment.HashTable().LookUp("EndOfFile"); bool endoffile = false; LispTokenizer tok; InfixParser parser(tok, *aEnvironment.CurrentInput(), aEnvironment, aEnvironment.PreFix(), aEnvironment.InFix(), aEnvironment.PostFix(), aEnvironment.Bodied()); while (!endoffile) { LispPtr readIn; // Read expression parser.Parse(readIn); if (!readIn) throw LispErrReadingFile(); // Check for end of file if (readIn->String() == eof) { endoffile = true; } // Else evaluate else { LispPtr result; aEnvironment.iEvaluator->Eval(aEnvironment, result, readIn); } } }