[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