[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