[pypy-commit] lang-scheme default: Translation fix
boemmels
noreply at buildbot.pypy.org
Mon Nov 28 00:38:32 CET 2011
Author: Juergen Boemmels <boemmels at web.de>
Branch:
Changeset: r20:f6d150fa70ba
Date: 2011-11-28 00:37 +0100
http://bitbucket.org/pypy/lang-scheme/changeset/f6d150fa70ba/
Log: Translation fix
While writing a test for it, I stumbled across some other error:
number? integer? et al. predicates are per R5RS applicable to all
scheme objects not just numbers. Fixed this too.
diff --git a/scheme/procedure.py b/scheme/procedure.py
--- a/scheme/procedure.py
+++ b/scheme/procedure.py
@@ -1,7 +1,7 @@
import py
from scheme.object import W_Root, W_Boolean, W_Pair, W_Symbol, \
W_Number, W_Real, W_Integer, W_List, W_Character, W_Vector, \
- Body, W_Procedure, W_Promise, plst2lst, w_undefined, \
+ Body, W_Procedure, W_String, W_Promise, plst2lst, w_undefined, \
SchemeSyntaxError, SchemeQuit, WrongArgType, WrongArgsNumber, \
w_nil
@@ -310,7 +310,25 @@
def predicate(self, w_obj):
raise NotImplementedError
-class IntegerP(PredicateNumber):
+class NumberP(W_Procedure):
+ # number? & Friends are applicable to any schemetype
+ # not just numbers
+ _symbol_name = "number?"
+
+ def procedure(self, ctx, lst):
+ if len(lst) != 1:
+ raise WrongArgsNumber
+
+ w_obj = lst[0]
+ if not isinstance(w_obj, W_Number):
+ return W_Boolean(False)
+
+ return W_Boolean(self.predicate(w_obj))
+
+ def predicate(self, w_obj):
+ return True
+
+class IntegerP(NumberP):
_symbol_name = "integer?"
def predicate(self, w_obj):
@@ -319,7 +337,7 @@
return True
-class RealP(PredicateNumber):
+class RealP(NumberP):
_symbol_name = "real?"
def predicate(self, w_obj):
@@ -328,12 +346,6 @@
class RationalP(RealP):
_symbol_name = "rational?"
-class NumberP(PredicateNumber):
- _symbol_name = "number?"
-
- def predicate(self, w_obj):
- return isinstance(w_obj, W_Number)
-
class ComplexP(NumberP):
_symbol_name = "complex?"
@@ -374,7 +386,7 @@
return w_obj.round() % 2 == 0
##
-# Type Pradicates
+# Type Predicates
##
class TypePredicate(W_Procedure):
def procedure(self, ctx, lst):
@@ -434,6 +446,7 @@
def predicate(self, w_obj):
return w_obj is w_nil
+
##
# Input/Output procedures
##
diff --git a/scheme/test/test_eval.py b/scheme/test/test_eval.py
--- a/scheme/test/test_eval.py
+++ b/scheme/test/test_eval.py
@@ -470,7 +470,7 @@
assert eval_noctx("(number? 42)").to_boolean()
assert eval_noctx("(number? 42.1)").to_boolean()
- py.test.raises(WrongArgType, eval_noctx, "(number? 'a)" )
+ assert eval_noctx("(number? 'a)").to_boolean() is False
def test_exactness():
assert eval_noctx("(exact? 42)").to_boolean()
diff --git a/scheme/test/test_scheme_level.py b/scheme/test/test_scheme_level.py
--- a/scheme/test/test_scheme_level.py
+++ b/scheme/test/test_scheme_level.py
@@ -85,3 +85,23 @@
'()
))
""")
+
+def test_typepredicates():
+ run_with_assert(r"""
+(define some-objs
+ (list #f #t 1 1.0 'symbol "string" #\c '(1 2) '() char? '#() '#(1 2)))
+(assert (equal?
+ (map (lambda (test-func) (map test-func some-objs))
+ (list boolean? number? symbol? string? char? pair? null? procedure? vector?))
+ ;; #f #t 1 1.0 'symbol "string" #\c '(1 2) '() char? '#() '#(1 2)
+ '((#t #t #f #f #f #f #f #f #f #f #f #f) ; boolean?
+ (#f #f #t #t #f #f #f #f #f #f #f #f) ; number?
+ (#f #f #f #f #t #f #f #f #f #f #f #f) ; symbol?
+ (#f #f #f #f #f #t #f #f #f #f #f #f) ; string?
+ (#f #f #f #f #f #f #t #f #f #f #f #f) ; char?
+ (#f #f #f #f #f #f #f #t #f #f #f #f) ; pair?
+ (#f #f #f #f #f #f #f #f #t #f #f #f) ; null?
+ (#f #f #f #f #f #f #f #f #f #t #f #f) ; procedure?
+ (#f #f #f #f #f #f #f #f #f #f #t #t)); vector?
+))
+""")
\ No newline at end of file
More information about the pypy-commit
mailing list