/* * Copyright (c) 1999-2003, Gene Cooperman; Rights to copy and distribute * for non-commercial purposes only are freely granted, but only as * long as this copyright statement remains. No warranty is implied. */ import java.io.*; public class SchemeInterpreter { public static void main(String[] args) throws IOException, ClassNotFoundException { SchemeFunction.initBuiltInFunctions(); //mytest(); // THE read-eval-print LOOP MUST BE INSERTED HERE. BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); SchemeReader reader = new SchemeReader( in ); while (true) { try { System.out.print("> "); System.out.println( reader.nextExpression().eval() ); } catch (SchemeError e) { e.printStackTrace(); } } } private static final void mytest() throws IOException { SchemeObject x = new Fixnum(3); System.out.println(x.eval()); SchemeReader sr; sr = new SchemeReader( new StringReader("'3") ); sr = new SchemeReader( new StringReader("'(+ 3 4)") ); System.out.println( sr.nextExpression().eval() ); sr = new SchemeReader( new StringReader("(+ 3 4)") ); System.out.println( sr.nextExpression().eval() ); sr = new SchemeReader( new StringReader("()") ); System.out.println( sr.nextExpression().eval() ); sr = new SchemeReader( new StringReader("(set! x 3)") ); System.out.println( sr.nextExpression().eval() ); sr = new SchemeReader( new StringReader("#t") ); System.out.println( sr.nextExpression().eval() ); sr = new SchemeReader( new StringReader("((lambda (x) x) 5)") ); System.out.println( sr.nextExpression().eval() ); sr = new SchemeReader( // inner lambda captures binding of x; lex. closure new StringReader("((lambda (x) (lambda (y) (+ y x))) 2)") ); System.out.println( sr.nextExpression().eval() ); sr = new SchemeReader( // inner lambda does not captures binding of x new StringReader("((lambda (a) a) (lambda (x) (+ x 1)))") ); System.out.println( sr.nextExpression().eval() ); sr = new SchemeReader( // Test shadowing new StringReader("((lambda (x) (lambda (x) (+ x 1))) 5)") ); System.out.println( sr.nextExpression().eval() ); sr = new SchemeReader(new StringReader( // x in inner lambda can be set "(set! foo (lambda (x) (set! bar (lambda () x)) (set! x 3) bar))" + "(if (= ((foo 1)) 3) 'correct 'wrong)") ); System.out.println( sr.nextExpression().eval() ); System.out.println( sr.nextExpression().eval() );; sr = new SchemeReader( // Test standard Currying new StringReader("(((lambda (x) (lambda (y) (+ y x))) 2) 3)") ); System.out.println( sr.nextExpression().eval() ); sr = new SchemeReader(new StringReader( "(define fact" + " (lambda (g)" + " (lambda (n)" + " (if (= n 0) 1 (* n (g (- n 1)))))))" + "(define Y" + " (lambda (f)" + " ((lambda (x) (f (lambda (y) 'first ((x x) y))))" + " (lambda (x) (f (lambda (y) 'second ((x x) y)))))))" + "((Y fact) 2)" + "((Y fact) 4)" + "(if (= ((Y fact) 4) 24) 'correct 'wrong)") ); // System.out.println( sr.nextExpression().eval() ); // System.out.println( sr.nextExpression().eval() ); // System.out.println( sr.nextExpression().eval() ); // System.out.println( sr.nextExpression().eval() ); // System.out.println( sr.nextExpression().eval() ); } static ObArray obArray = ObArray.getInstance(); } // SchemeError will be caught in the read-eval-print loop, but not before. class SchemeError extends Error { SchemeError() { super(); } SchemeError(String str) { super(str); } }