Differences From Artifact [404b54e69646e17a]:
- File
main.d
- 2010-11-08 16:40:55 - part of checkin [aa770610d3] on branch trunk - added layered-let (user: kinaba) [annotate]
To Artifact [14a3f0cd527958ce]:
- File
main.d
- 2010-11-09 06:02:32 - part of checkin [7de80acfb8] on branch trunk - Added ultra tenuki REPL (user: kinaba) [annotate]
2 * Authors: k.inaba 2 * Authors: k.inaba
3 * License: NYSL 0.9982 (http://www.kmonos.net/nysl/ 3 * License: NYSL 0.9982 (http://www.kmonos.net/nysl/
4 * 4 *
5 * Entry point for Polemy interpreter. 5 * Entry point for Polemy interpreter.
6 */ 6 */
7 7
8 import std.stdio; 8 import std.stdio;
> 9 import std.algorithm;
> 10 import polemy.value;
> 11 import polemy.lex;
> 12 import polemy.parse;
> 13 import polemy.ast;
> 14 import polemy.eval;
9 15
10 version(unittest) static ~this() | 16 class REPL
11 { 17 {
12 writeln( "(Press Enter to finish)" ); | 18 Table ctx;
> 19 string buf;
> 20 Value lastVal;
> 21 int lineno = 1;
> 22 int nextlineno = 1;
> 23 this() { ctx = createGlobalContext(); }
> 24
> 25 bool tryRun( string s )
> 26 {
> 27 nextlineno ++;
> 28 buf ~= s;
> 29 try {
> 30 AST a = parseString(buf, "<REPL>", lineno);
> 31 buf = "";
> 32 lineno = nextlineno;
> 33 lastVal = eval(a, ctx);
> 34 } catch( LexException ) {
> 35 // always EOF exception, so wait next
> 36 return false;
> 37 } catch( ParseException e ) {
> 38 if( find(e.msg, "EOF") ) // ultra ad-hoc
> 39 return false;
> 40 throw e;
> 41 }
> 42 return true;
> 43 }
> 44
> 45 bool singleInteraction()
> 46 {
> 47 writef(">> ", lineno);
13 readln(); | 48 string line = readln();
> 49 if( line.startsWith("exit") || line.startsWith("quit") )
> 50 return false;
> 51 try {
> 52 if( tryRun(line) )
> 53 writeln(lastVal);
> 54 } catch(Throwable e) {
> 55 writeln(e);
> 56 }
> 57 return true;
> 58 }
14 } 59 }
15 60
16 void main( string[] args ) 61 void main( string[] args )
17 { 62 {
> 63 if( args.length <= 1 )
> 64 {
> 65 writeln("Welcome to Polemy 0.1.0");
> 66 for(auto r = new REPL; r.singleInteraction();) {}
> 67 }
> 68 else
> 69 {
> 70 evalFile(args[1]);
> 71 }
18 } 72 }