[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