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

jlg at codespeak.net jlg at codespeak.net
Fri Aug 17 16:17:35 CEST 2007


Author: jlg
Date: Fri Aug 17 16:17:35 2007
New Revision: 45815

Modified:
   pypy/dist/pypy/lang/scheme/TODO.txt
   pypy/dist/pypy/lang/scheme/object.py
   pypy/dist/pypy/lang/scheme/test/test_eval.py
Log:
type-predicates procedures and equal? added

Modified: pypy/dist/pypy/lang/scheme/TODO.txt
==============================================================================
--- pypy/dist/pypy/lang/scheme/TODO.txt	(original)
+++ pypy/dist/pypy/lang/scheme/TODO.txt	Fri Aug 17 16:17:35 2007
@@ -9,10 +9,7 @@
 Do next
 -------
 
-- implement key functions
-  (apply, map and so on)
-
-- comparison: < >
+- implement key procedures
 
 Do in some future
 -----------------
@@ -24,8 +21,19 @@
 
 - input/output operations
 - missing datatypes: chars, vectors
-- datatypes manipulation procedures
+  + manipulation procedures
 
 - switch to byte-code generation + eval instead of evaluating AST
 - random code stress test
 
+Missing procedures
+------------------
+ #number:
+< > <= >= quotient reminder modulo numberator denominator floor ceiling truncate round exp log sin cos tan asin acos atan sqrt expt make-rectangular make-polar real-part imag-part magnitude angle exact->inexact inexact->exact
+
+dynamic-wind
+call-with-values
+values
+eval
+scheme-report-environment
+null-environment

Modified: pypy/dist/pypy/lang/scheme/object.py
==============================================================================
--- pypy/dist/pypy/lang/scheme/object.py	(original)
+++ pypy/dist/pypy/lang/scheme/object.py	Fri Aug 17 16:17:35 2007
@@ -54,10 +54,10 @@
     def eval_tr(self, ctx):
         return (self, None)
 
-    def eqv(self, w_obj):
+    def eq(self, w_obj):
         return self is w_obj
-
-    eq = eqv
+    eqv = eq
+    equal = eqv
 
 class W_Undefined(W_Root):
     def to_string(self):
@@ -116,8 +116,8 @@
         if isinstance(w_obj, W_Boolean):
             return self.boolval is w_obj.boolval
         return False
-
     eq = eqv
+    equal = eqv
 
 class W_String(W_Root):
     def __init__(self, val):
@@ -167,6 +167,7 @@
         return isinstance(w_obj, W_Real) \
                 and self.exact is w_obj.exact \
                 and self.realval == w_obj.realval
+    equal = eqv
 
 W_Number = W_Real
 
@@ -296,6 +297,11 @@
             raise SchemeSyntaxError
         return res
 
+    def equal(self, w_obj):
+        return isinstance(w_obj, W_Pair) and \
+                self.car.equal(w_obj.car) and \
+                self.cdr.equal(w_obj.cdr)
+
 class W_Callable(W_Eval):
     def call_tr(self, ctx, lst):
         #usually tail-recursive call is normal call
@@ -699,6 +705,15 @@
         (a, b) = lst
         return W_Boolean(a.eqv(b))
 
+class EqualP(W_Procedure):
+    _symbol_name = "equal?"
+
+    def procedure(self, ctx, lst):
+        if len(lst) != 2:
+            raise WrongArgsNumber
+
+        (a, b) = lst
+        return W_Boolean(a.equal(b))
 ##
 # Predicate
 ##
@@ -782,24 +797,36 @@
 ##
 # Type Pradicates
 ##
-
-class PairP(W_Procedure):
-    _symbol_name = "pair?"
-
+class TypePredicate(W_Procedure):
     def procedure(self, ctx, lst):
         if len(lst) != 1:
             raise WrongArgsNumber
 
-        return W_Boolean(isinstance(lst[0], W_Pair))
+        return W_Boolean(self.predicate(lst[0]))
 
-class ProcedureP(W_Procedure):
-    _symbol_name = "procedure?"
+class BooleanP(TypePredicate):
+    _symbol_name = "boolean?"
 
-    def procedure(self, ctx, lst):
-        if len(lst) != 1:
-            raise WrongArgsNumber
+    def predicate(self, w_obj):
+        return isinstance(w_obj, W_Boolean)
+
+class SymbolP(TypePredicate):
+    _symbol_name = "symbol?"
+
+    def predicate(self, w_obj):
+        return isinstance(w_obj, W_Symbol)
 
-        return W_Boolean(isinstance(lst[0], W_Procedure))
+class PairP(TypePredicate):
+    _symbol_name = "pair?"
+
+    def predicate(self, w_obj):
+        return isinstance(w_obj, W_Pair)
+
+class ProcedureP(TypePredicate):
+    _symbol_name = "procedure?"
+
+    def predicate(self, w_obj):
+        return isinstance(w_obj, W_Procedure)
 
 ##
 # Input/Output procedures
@@ -1560,6 +1587,7 @@
         return w_macro #undefined
  
 class LetSyntax(W_Macro):
+    #XXX letrec-syntax missing
     _symbol_name = "let-syntax"
 
     def call_tr(self, ctx, lst):

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	Fri Aug 17 16:17:35 2007
@@ -640,6 +640,8 @@
     ctx = ExecutionContext()
 
     assert eval_(ctx, "(pair? 1)").to_boolean() is False
+    assert eval_(ctx, "(pair? 'symb)").to_boolean() is False
+    assert eval_(ctx, "(pair? #f)").to_boolean() is False
     assert eval_(ctx, "(pair? '())").to_boolean() is False
     assert eval_(ctx, "(pair? +)").to_boolean() is False
     assert eval_(ctx, "(pair? (lambda () 1))").to_boolean() is False
@@ -648,6 +650,8 @@
     assert eval_(ctx, "(pair? (cons 1 2))").to_boolean() is True
 
     assert eval_(ctx, "(procedure? 1)").to_boolean() is False
+    assert eval_(ctx, "(procedure? 'symb)").to_boolean() is False
+    assert eval_(ctx, "(procedure? #f)").to_boolean() is False
     assert eval_(ctx, "(procedure? '())").to_boolean() is False
     assert eval_(ctx, "(procedure? '(1))").to_boolean() is False
     assert eval_(ctx, "(procedure? (list 1))").to_boolean() is False
@@ -655,6 +659,27 @@
     assert eval_(ctx, "(procedure? +)").to_boolean() is True
     assert eval_(ctx, "(procedure? (lambda () 1))").to_boolean() is True
 
+    assert eval_(ctx, "(symbol? 1)").to_boolean() is False
+    assert eval_(ctx, "(symbol? 'symb)").to_boolean() is True
+    assert eval_(ctx, "(symbol? #f)").to_boolean() is False
+    assert eval_(ctx, "(symbol? '())").to_boolean() is False
+    assert eval_(ctx, "(symbol? '(1))").to_boolean() is False
+    assert eval_(ctx, "(symbol? (list 1))").to_boolean() is False
+    assert eval_(ctx, "(symbol? (cons 1 2))").to_boolean() is False
+    assert eval_(ctx, "(symbol? +)").to_boolean() is False
+    assert eval_(ctx, "(symbol? (lambda () 1))").to_boolean() is False
+
+    assert eval_(ctx, "(boolean? 1)").to_boolean() is False
+    assert eval_(ctx, "(boolean? 'symb)").to_boolean() is False
+    assert eval_(ctx, "(boolean? #f)").to_boolean() is True
+    assert eval_(ctx, "(boolean? #t)").to_boolean() is True
+    assert eval_(ctx, "(boolean? '())").to_boolean() is False
+    assert eval_(ctx, "(boolean? '(1))").to_boolean() is False
+    assert eval_(ctx, "(boolean? (list 1))").to_boolean() is False
+    assert eval_(ctx, "(boolean? (cons 1 2))").to_boolean() is False
+    assert eval_(ctx, "(boolean? +)").to_boolean() is False
+    assert eval_(ctx, "(boolean? (lambda () 1))").to_boolean() is False
+
 def test_eqv():
     ctx = ExecutionContext()
 
@@ -723,6 +748,41 @@
     assert eval_(ctx, """(eq? (lambda () 1)
                                (lambda () 2))""").to_boolean() is False
 
+def test_equal():
+    ctx = ExecutionContext()
+
+    assert eval_(ctx, "(equal? #t #t)").to_boolean() is True
+    assert eval_(ctx, "(equal? #f #f)").to_boolean() is True
+    assert eval_(ctx, "(equal? 'symb 'symb)").to_boolean() is True
+    assert eval_(ctx, "(equal? 'symb 'SYMB)").to_boolean() is True
+    assert eval_(ctx, "(equal? 42 42)").to_boolean() is True
+    assert eval_(ctx, "(equal? 42.1 42.1)").to_boolean() is True
+    #assert eval_(ctx, "(equal? #\a #\a)").to_boolean() is True
+    assert eval_(ctx, "(equal? '() '())").to_boolean() is True
+    assert eval_(ctx, """(let ((p (cons 1 2)))
+                           (equal? p p))""").to_boolean() is True
+    #assert eval_(ctx, """(let ((p "a string"))
+    #                       (equal? p p))""").to_boolean() is True
+    assert eval_(ctx, """(let ((p (lambda (x) x)))
+                           (equal? p p))""").to_boolean() is True
+
+    assert eval_(ctx, "(equal? #t 'symb)").to_boolean() is False
+    assert eval_(ctx, "(equal? #f 42)").to_boolean() is False
+    assert eval_(ctx, "(equal? #t #f)").to_boolean() is False
+    assert eval_(ctx, "(equal? 'symb1 'symb2)").to_boolean() is False
+    assert eval_(ctx, "(equal? 42 42.0)").to_boolean() is False
+    assert eval_(ctx, "(equal? 42.0 42)").to_boolean() is False
+    assert eval_(ctx, "(equal? 42 43)").to_boolean() is False
+    assert eval_(ctx, "(equal? 42.1 42.2)").to_boolean() is False
+    #assert eval_(ctx, "(equal? #\a #\b)").to_boolean() is False
+    assert eval_(ctx, "(equal? (cons 1 2) (cons 1 2))").to_boolean() is True
+    #assert eval_(ctx, """(equal? "a string"
+    #                            "a string")""").to_boolean() is True
+    assert eval_(ctx, """(equal? (lambda () 1)
+                               (lambda () 2))""").to_boolean() is False
+    assert eval_(ctx, "(equal? '(a (b) c) '(a (b) c))").to_boolean() is True
+    assert eval_(ctx, "(equal? '(a (b) c) '(a (e) c))").to_boolean() is False
+
 def test_apply():
     ctx = ExecutionContext()
     assert eval_(ctx, "(apply + (list 3 4))").to_number() == 7
@@ -738,4 +798,3 @@
     py.test.raises(WrongArgsNumber, eval_, ctx, "(apply 1)")
     py.test.raises(WrongArgType, eval_, ctx, "(apply 1 '(1))")
     py.test.raises(WrongArgType, eval_, ctx, "(apply + 42)")
-



More information about the Pypy-commit mailing list