[pypy-svn] r44924 - in pypy/dist/pypy/lang/scheme: . test

jlg at codespeak.net jlg at codespeak.net
Wed Jul 11 12:55:40 CEST 2007


Author: jlg
Date: Wed Jul 11 12:55:39 2007
New Revision: 44924

Modified:
   pypy/dist/pypy/lang/scheme/interactive.py
   pypy/dist/pypy/lang/scheme/object.py
   pypy/dist/pypy/lang/scheme/ssparser.py
   pypy/dist/pypy/lang/scheme/test/test_eval.py
Log:
quit procedure (raises SchemeQuit); intercept the parser errors and reraise as SchemeParsingError

Modified: pypy/dist/pypy/lang/scheme/interactive.py
==============================================================================
--- pypy/dist/pypy/lang/scheme/interactive.py	(original)
+++ pypy/dist/pypy/lang/scheme/interactive.py	Wed Jul 11 12:55:39 2007
@@ -3,9 +3,9 @@
 scheme interpreter
 """
 import autopath
-from pypy.lang.scheme.object import ExecutionContext, SchemeException
-from pypy.lang.scheme.ssparser import parse
-from pypy.rlib.parsing.makepackrat import BacktrackException
+from pypy.lang.scheme.object import ExecutionContext, SchemeException, \
+        SchemeQuit
+from pypy.lang.scheme.ssparser import parse, SchemeParsingError
 import os, sys
 
 def check_parens(s):
@@ -26,9 +26,11 @@
         if check_parens(to_exec):
             try:
                 print parse(to_exec).eval(ctx)
+            except SchemeQuit, e:
+                break
             except SchemeException, e:
                 print "error: %s" % e
-            except BacktrackException, e:
+            except SchemeParsingError, e:
                 print "syntax error"
 
             to_exec = ""

Modified: pypy/dist/pypy/lang/scheme/object.py
==============================================================================
--- pypy/dist/pypy/lang/scheme/object.py	(original)
+++ pypy/dist/pypy/lang/scheme/object.py	Wed Jul 11 12:55:39 2007
@@ -7,6 +7,9 @@
     def __str__(self):
         return "Unbound variable %s" % self.args[0]
 
+class SchemeQuit(SchemeException):
+    pass
+
 class W_Root(object):
     def to_string(self):
         return ''
@@ -312,6 +315,10 @@
         w_second = lst[1]
         return W_Boolean(w_first.equal(w_second))
 
+class Quit(W_Procedure):
+    def procedure(self, ctx, lst):
+        raise SchemeQuit
+
 class Lambda(W_Macro):
     def eval(self, ctx, lst):
         w_args = lst.car
@@ -395,6 +402,7 @@
         'car': Car,
         'cdr': Cdr,
         'list': List,
+        'quit': Quit,
             #comparisons
         '=': Equal,
             #macros

Modified: pypy/dist/pypy/lang/scheme/ssparser.py
==============================================================================
--- pypy/dist/pypy/lang/scheme/ssparser.py	(original)
+++ pypy/dist/pypy/lang/scheme/ssparser.py	Wed Jul 11 12:55:39 2007
@@ -1,8 +1,8 @@
 import autopath
 from pypy.rlib.parsing.pypackrat import PackratParser
 from pypy.rlib.parsing.makepackrat import BacktrackException, Status
-from pypy.lang.scheme.object import W_Pair, W_Fixnum, W_String, W_Identifier
-from pypy.lang.scheme.object import W_Nil, W_Boolean, W_Float, Literal
+from pypy.lang.scheme.object import W_Pair, W_Fixnum, W_String, W_Identifier, \
+        W_Nil, W_Boolean, W_Float, Literal, SchemeException
 
 def unquote(s):
     return s.replace('\\"', '"')
@@ -80,6 +80,14 @@
       | return {W_Nil()};
     '''
 
+class SchemeParsingError(SchemeException):
+    pass
+
 def parse(code):
-    p = SchemeParser(code)
+    try:
+        p = SchemeParser(code)
+    except BacktrackException, e:
+        raise SchemeParsingError
+
     return p.file()
+

Modified: pypy/dist/pypy/lang/scheme/test/test_eval.py
==============================================================================
--- pypy/dist/pypy/lang/scheme/test/test_eval.py	(original)
+++ pypy/dist/pypy/lang/scheme/test/test_eval.py	Wed Jul 11 12:55:39 2007
@@ -342,3 +342,7 @@
                             (even? (- n 1))))))
                 (even? 12))""")
     assert w_result.to_boolean() is True
+
+def test_quit():
+    py.test.raises(SchemeQuit, eval_noctx, "(quit)")
+



More information about the Pypy-commit mailing list