[pypy-svn] r45657 - in pypy/dist/pypy/lang/scheme: . test
jlg at codespeak.net
jlg at codespeak.net
Tue Aug 14 18:19:44 CEST 2007
Author: jlg
Date: Tue Aug 14 18:19:43 2007
New Revision: 45657
Added:
pypy/dist/pypy/lang/scheme/r5rs_derived_expr.ss
Modified:
pypy/dist/pypy/lang/scheme/execution.py
pypy/dist/pypy/lang/scheme/object.py
pypy/dist/pypy/lang/scheme/test/test_continuation.py
pypy/dist/pypy/lang/scheme/test/test_eval.py
pypy/dist/pypy/lang/scheme/test/test_macro.py
Log:
letrec is continuation friendly, achived in wierd way; macros ellipsis corner-case fixed, still some to be done; added r4rs_derived_expr.ss which defines syntax for (cond...), (and ...) and (or ...) using macros while ExecutionContext init
Modified: pypy/dist/pypy/lang/scheme/execution.py
==============================================================================
--- pypy/dist/pypy/lang/scheme/execution.py (original)
+++ pypy/dist/pypy/lang/scheme/execution.py Tue Aug 14 18:19:43 2007
@@ -1,5 +1,6 @@
import pypy.lang.scheme.object as ssobject
-#from pypy.lang.scheme.object import *
+from pypy.lang.scheme.ssparser import parse
+import py
class Location(object):
def __init__(self, w_obj=None):
@@ -14,6 +15,10 @@
except (TypeError, AttributeError):
pass
+de_file = py.magic.autopath().dirpath().join("r5rs_derived_expr.ss")
+de_code = de_file.read()
+de_expr_lst = parse(de_code)
+
class ExecutionContext(object):
"""Execution context implemented as a dict.
@@ -21,14 +26,6 @@
"""
def __init__(self, globalscope=None, scope=None, closure=False,
cont_stack=None):
- if globalscope is None:
- self.globalscope = {}
- for name, oper in OPERATION_MAP.items():
- self.globalscope[name] = Location(oper)
-
- else:
- self.globalscope = globalscope
-
if scope is None:
self.scope = {}
else:
@@ -41,6 +38,17 @@
else:
self.cont_stack = cont_stack
+ if globalscope is None:
+ self.globalscope = {}
+ for name, oper in OPERATION_MAP.items():
+ self.globalscope[name] = Location(oper)
+
+ for expr in de_expr_lst:
+ expr.eval(self)
+
+ else:
+ self.globalscope = globalscope
+
def _dispatch(self, symb):
if isinstance(symb, ssobject.SymbolClosure):
return (symb.closure, symb.name)
Modified: pypy/dist/pypy/lang/scheme/object.py
==============================================================================
--- pypy/dist/pypy/lang/scheme/object.py (original)
+++ pypy/dist/pypy/lang/scheme/object.py Tue Aug 14 18:19:43 2007
@@ -198,11 +198,9 @@
return "()"
def eval_cf(self, ctx, caller, cont, elst=[], enum=0):
- #XXX not tests here
raise SchemeSyntaxError
def eval_tr(self, ctx):
- #XXX not tests here
raise SchemeSyntaxError
w_nil = W_Nil()
@@ -648,6 +646,16 @@
return w_promise.force(ctx)
+#XXX no tests in eval
+class EqP(W_Procedure):
+ _symbol_name = "eq?"
+
+ def procedure(self, ctx, lst):
+ if len(lst) != 2:
+ raise WrongArgsNumber
+
+ return W_Boolean(lst[0] is lst[1])
+
##
# Predicate
##
@@ -728,7 +736,10 @@
return w_obj.round() % 2 == 0
-#XXX no tests for it
+##
+# Type Pradicates
+##
+
class PairP(W_Procedure):
_symbol_name = "pair?"
@@ -736,11 +747,16 @@
if len(lst) != 1:
raise WrongArgsNumber
- w_obj = lst[0]
- if isinstance(w_obj, W_Pair):
- return W_Boolean(True)
+ return W_Boolean(isinstance(lst[0], W_Pair))
+
+class ProcedureP(W_Procedure):
+ _symbol_name = "procedure?"
+
+ def procedure(self, ctx, lst):
+ if len(lst) != 1:
+ raise WrongArgsNumber
- return W_Boolean(False)
+ return W_Boolean(isinstance(lst[0], W_Procedure))
##
# Macro
@@ -896,9 +912,35 @@
return body.eval_tr(local_ctx)
+class DictWrapper(W_Root):
+ def __init__(self, w_dict):
+ self.d = w_dict
+
class Letrec(W_Macro):
_symbol_name = "letrec"
+ def continue_tr(self, ctx, lst, elst, cnt=True):
+ ctx = ctx.copy()
+ (body, name_symb, name_val, cont_val) = elst
+ assert isinstance(name_symb, DictWrapper)
+ assert isinstance(name_val, DictWrapper)
+ assert isinstance(lst, W_Symbol)
+
+ cont_name = lst.name
+ for (name, w_val) in name_val.d.items():
+ if name == cont_name:
+ ctx.ssete(lst, cont_val)
+ else:
+ ctx.ssete(name_symb.d[name], w_val)
+
+ w_result = body.eval(ctx)
+
+ if len(ctx.cont_stack) == 0:
+ raise ContinuationReturn(w_result)
+
+ cont = ctx.cont_stack.pop()
+ return cont.run(ctx, w_result)
+
def call_tr(self, ctx, lst):
"""let uses eval_body, so it is tail-recursive aware"""
if not isinstance(lst, W_Pair):
@@ -907,6 +949,7 @@
body = Body(lst.cdr)
map_name_expr = {}
map_name_symb = {}
+ w_name_symb = DictWrapper(map_name_symb)
w_formal = lst.car
while isinstance(w_formal, W_Pair):
w_def = w_formal.get_car_as_pair()
@@ -917,8 +960,12 @@
w_formal = w_formal.cdr
map_name_val = {}
+ w_name_val = DictWrapper(map_name_val)
for (name, expr) in map_name_expr.items():
- map_name_val[name] = expr.eval(local_ctx)
+ #map_name_val[name] = expr.eval(local_ctx)
+ map_name_val[name] = expr.eval_cf(local_ctx, self,
+ map_name_symb[name],
+ [body, w_name_symb, w_name_val], 3)
for (name, w_val) in map_name_val.items():
local_ctx.ssete(map_name_symb[name], w_val)
@@ -1116,14 +1163,16 @@
return self.matchr(ctx, self.pattern.cdr, w_expr.cdr)
def matchr(self, ctx, w_patt, w_expr):
+ print " >", w_patt.to_string(), w_expr.to_string()
if isinstance(w_patt, W_Pair):
w_pattcar = w_patt.car
+ w_pattcdr = w_patt.cdr
if isinstance(w_expr, W_Pair):
mdict_car = self.matchr(ctx, w_pattcar, w_expr.car)
try:
#we catch EllipsisPattern here because in car
# we dont know how to deal with it
- mdict_cdr = self.matchr(ctx, w_patt.cdr, w_expr.cdr)
+ mdict_cdr = self.matchr(ctx, w_pattcdr, w_expr.cdr)
except EllipsisPattern:
print "ellipsis matched", w_patt, w_expr
@@ -1144,8 +1193,19 @@
mdict_car.update(mdict_cdr)
return mdict_car
- if w_pattcar is w_ellipsis and w_expr is w_nil:
- raise EllipsisPattern
+ if w_expr is w_nil:
+ #one matched to ellipsis
+ if w_pattcar is w_ellipsis:
+ raise EllipsisPattern
+
+ #zero matched to ellipsis
+ if isinstance(w_pattcdr, W_Pair) and \
+ w_pattcdr.car is w_ellipsis:
+ if not isinstance(w_pattcar, W_Symbol):
+ #XXX this must be added
+ #print w_patt, "matched to ()"
+ raise NotImplementedError
+ return {w_pattcar.name: Ellipsis([])}
if w_patt is w_ellipsis:
raise EllipsisPattern
@@ -1224,6 +1284,7 @@
def match(self, ctx, w_expr):
for rule in self.syntax_lst:
try:
+ print "m>", rule.pattern.to_string()
match_dict = rule.match(ctx, w_expr)
return (rule.template, match_dict)
except MatchError:
@@ -1233,6 +1294,7 @@
def expand(self, ctx, w_expr):
try:
+ print w_expr.to_string()
(template, match_dict) = self.match(ctx, w_expr)
except MatchError:
raise SchemeSyntaxError
Added: pypy/dist/pypy/lang/scheme/r5rs_derived_expr.ss
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/lang/scheme/r5rs_derived_expr.ss Tue Aug 14 18:19:43 2007
@@ -0,0 +1,41 @@
+(define-syntax cond
+ (syntax-rules (else =>)
+ ((cond (else result1 result2 ...))
+ (begin result1 result2 ...))
+ ((cond (test => result))
+ (let ((temp test))
+ (if temp (result temp))))
+ ((cond (test => result) clause1 clause2 ...)
+ (let ((temp test))
+ (if temp
+ (result temp)
+ (cond clause1 clause2 ...))))
+ ((cond (test)) test)
+ ((cond (test) clause1 clause2 ...)
+ (let ((temp test))
+ (if temp
+ temp
+ (cond clause1 clause2 ...))))
+ ((cond (test result1 result2 ...))
+ (if test (begin result1 result2 ...)))
+ ((cond (test result1 result2 ...)
+ clause1 clause2 ...)
+ (if test
+ (begin result1 result2 ...)
+ (cond clause1 clause2 ...)))))
+
+(define-syntax and
+ (syntax-rules ()
+ ((and) #t)
+ ((and test) test)
+ ((and test1 test2 ...)
+ (if test1 (and test2 ...) #f))))
+
+(define-syntax or
+ (syntax-rules ()
+ ((or) #f)
+ ((or test) test)
+ ((or test1 test2 ...)
+ (let ((x test1))
+ (if x x (or test2 ...))))))
+
Modified: pypy/dist/pypy/lang/scheme/test/test_continuation.py
==============================================================================
--- pypy/dist/pypy/lang/scheme/test/test_continuation.py (original)
+++ pypy/dist/pypy/lang/scheme/test/test_continuation.py Tue Aug 14 18:19:43 2007
@@ -211,7 +211,6 @@
assert w_result.to_number() == 10
def test_pitfall_1_1():
- py.test.skip("letrec not cf")
ctx = ExecutionContext()
w_result = eval_(ctx, """
(let ((cont #f))
@@ -228,20 +227,20 @@
assert w_result.to_number() == 1
def test_pitfall_1_2():
- py.test.skip("(cond ...) and (procedure? ...) not implemented")
+ #py.test.skip("(cond ...), (and ...) not implemented")
ctx = ExecutionContext()
+
w_result = eval_(ctx, """
(letrec ((x (call/cc list)) (y (call/cc list)))
(cond ((procedure? x) (x (pair? y)))
- ((procedure? y) (y (pair? x))))
+ ((procedure? y) (y (pair? x))))
(let ((x (car x)) (y (car y)))
- (and (call/cc x) (call/cc y) (call/cc x)))))""")
+ (and (call/cc x) (call/cc y) (call/cc x))))""")
assert isinstance(w_result, W_Boolean)
assert w_result.to_boolean() is True
def test_pitfall_1_3():
- py.test.skip("(eq? ...) not implemented, letrec not cf")
ctx = ExecutionContext()
w_result = eval_(ctx, """
(letrec ((x (call/cc
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 Tue Aug 14 18:19:43 2007
@@ -8,7 +8,7 @@
W_Pair(W_Integer(4), W_Pair(W_Integer(5), w_nil)))
assert w_num.eval(ExecutionContext()).to_number() == 9
-def eval_expr(ctx, expr):
+def eval_(ctx, expr):
return parse(expr)[0].eval(ctx)
def eval_noctx(expr):
@@ -67,73 +67,73 @@
ctx.put("v1", W_Integer(4))
ctx.put("v2", W_Integer(5))
- w_num = eval_expr(ctx, "(+ 1 v1 v2)")
+ w_num = eval_(ctx, "(+ 1 v1 v2)")
assert w_num.to_number() == 10
ctx.put("v2", W_Real(3.2))
- w_num = eval_expr(ctx, "(+ 1 v1 v2)")
+ w_num = eval_(ctx, "(+ 1 v1 v2)")
assert w_num.to_number() == 8.2
def test_ctx_define():
ctx = ExecutionContext()
- eval_expr(ctx, "(define v1 42)")
+ eval_(ctx, "(define v1 42)")
assert ctx.get("v1").to_number() == 42
- w_num = eval_expr(ctx, "v1")
+ w_num = eval_(ctx, "v1")
assert w_num.to_number() == 42
- eval_expr(ctx, "(define v2 2.1)")
+ eval_(ctx, "(define v2 2.1)")
assert ctx.get("v2").to_number() == 2.1
- w_num = eval_expr(ctx, "(+ 1 v1 v2)")
+ w_num = eval_(ctx, "(+ 1 v1 v2)")
assert w_num.to_number() == 45.1
- eval_expr(ctx, "(define v2 3.1)")
- w_num = eval_expr(ctx, "(+ 1 v1 v2)")
+ eval_(ctx, "(define v2 3.1)")
+ w_num = eval_(ctx, "(+ 1 v1 v2)")
assert w_num.to_number() == 46.1
def text_unbound():
ctx = ExecutionContext()
- py.test.raises(UnboundVariable, eval_expr, ctx, "y")
+ py.test.raises(UnboundVariable, eval_, ctx, "y")
def test_sete():
ctx = ExecutionContext()
- eval_expr(ctx, "(define x 42)")
+ eval_(ctx, "(define x 42)")
loc1 = ctx.get_location("x")
- eval_expr(ctx, "(set! x 43)")
+ eval_(ctx, "(set! x 43)")
loc2 = ctx.get_location("x")
assert ctx.get("x").to_number() == 43
assert loc1 is loc2
- py.test.raises(UnboundVariable, eval_expr, ctx, "(set! y 42)")
+ py.test.raises(UnboundVariable, eval_, ctx, "(set! y 42)")
def test_func():
ctx = ExecutionContext()
- w_func = eval_expr(ctx, "+")
+ w_func = eval_(ctx, "+")
assert isinstance(w_func, W_Procedure)
def test_if_simple():
ctx = ExecutionContext()
- w_t = eval_expr(ctx, "(if #t #t #f)")
+ w_t = eval_(ctx, "(if #t #t #f)")
assert w_t.to_boolean() is True
- w_f = eval_expr(ctx, "(if #f #t #f)")
+ w_f = eval_(ctx, "(if #f #t #f)")
assert w_f.to_boolean() is False
- w_f = eval_expr(ctx, "(if 1 #f #t)")
+ w_f = eval_(ctx, "(if 1 #f #t)")
assert w_f.to_boolean() is False
- w_f = eval_expr(ctx, "(if #t #t)")
+ w_f = eval_(ctx, "(if #t #t)")
assert w_f.to_boolean() is True
- w_f = eval_expr(ctx, "(if #f #t)")
+ w_f = eval_(ctx, "(if #f #t)")
assert w_f.to_boolean() is False
def test_if_evaluation():
ctx = ExecutionContext()
- eval_expr(ctx, "(define then #f)")
- eval_expr(ctx, "(define else #f)")
- eval_expr(ctx, "(if #t (define then #t) (define else #t))")
+ eval_(ctx, "(define then #f)")
+ eval_(ctx, "(define else #f)")
+ eval_(ctx, "(if #t (define then #t) (define else #t))")
assert ctx.get("then").to_boolean() is True
assert ctx.get("else").to_boolean() is False
- eval_expr(ctx, "(define then #f)")
- eval_expr(ctx, "(define else #f)")
- eval_expr(ctx, "(if #f (define then #t) (define else #t))")
+ eval_(ctx, "(define then #f)")
+ eval_(ctx, "(define else #f)")
+ eval_(ctx, "(if #f (define then #t) (define else #t))")
assert ctx.get("then").to_boolean() is False
assert ctx.get("else").to_boolean() is True
@@ -205,81 +205,81 @@
def test_lambda_noargs():
ctx = ExecutionContext()
- w_lambda = eval_expr(ctx, "(lambda () 12)")
+ w_lambda = eval_(ctx, "(lambda () 12)")
assert isinstance(w_lambda, W_Procedure)
assert isinstance(w_lambda, W_Lambda)
ctx.put("f1", w_lambda)
- w_result = eval_expr(ctx, "(f1)")
+ w_result = eval_(ctx, "(f1)")
assert isinstance(w_result, W_Integer)
assert w_result.to_number() == 12
def test_lambda_args():
ctx = ExecutionContext()
- w_lam = eval_expr(ctx, "(define f1 (lambda (n) n))")
+ w_lam = eval_(ctx, "(define f1 (lambda (n) n))")
assert isinstance(w_lam, W_Lambda)
- w_result = eval_expr(ctx, "(f1 42)")
+ w_result = eval_(ctx, "(f1 42)")
assert isinstance(w_result, W_Integer)
assert w_result.to_number() == 42
- w_result = eval_expr(ctx, "((lambda (n m) (+ n m)) 42 -42)")
+ w_result = eval_(ctx, "((lambda (n m) (+ n m)) 42 -42)")
assert isinstance(w_result, W_Integer)
assert w_result.to_number() == 0
def test_lambda_top_ctx():
ctx = ExecutionContext()
- eval_expr(ctx, "(define n 42)")
- eval_expr(ctx, "(define f1 (lambda (m) (+ n m)))")
- w_result = eval_expr(ctx, "(f1 -42)")
+ eval_(ctx, "(define n 42)")
+ eval_(ctx, "(define f1 (lambda (m) (+ n m)))")
+ w_result = eval_(ctx, "(f1 -42)")
assert isinstance(w_result, W_Integer)
assert w_result.to_number() == 0
- eval_expr(ctx, "(define n 84)")
- w_result = eval_expr(ctx, "(f1 -42)")
+ eval_(ctx, "(define n 84)")
+ w_result = eval_(ctx, "(f1 -42)")
assert isinstance(w_result, W_Integer)
assert w_result.to_number() == 42
def test_lambda_fac():
ctx = ExecutionContext()
- eval_expr(ctx, """
+ eval_(ctx, """
(define fac
(lambda (n)
(if (= n 1)
n
(* (fac (- n 1)) n))))""")
assert isinstance(ctx.get("fac"), W_Lambda)
- w_result = eval_expr(ctx, "(fac 4)")
+ w_result = eval_(ctx, "(fac 4)")
assert w_result.to_number() == 24
- w_result = eval_expr(ctx, "(fac 5)")
+ w_result = eval_(ctx, "(fac 5)")
assert w_result.to_number() == 120
def test_lambda2():
ctx = ExecutionContext()
- eval_expr(ctx, """(define adder (lambda (x) (lambda (y) (+ x y))))""")
- w_lambda = eval_expr(ctx, "(adder 6)")
+ eval_(ctx, """(define adder (lambda (x) (lambda (y) (+ x y))))""")
+ w_lambda = eval_(ctx, "(adder 6)")
assert isinstance(w_lambda, W_Lambda)
- eval_expr(ctx, """(define add6 (adder 6))""")
- w_result = eval_expr(ctx, "(add6 5)")
+ eval_(ctx, """(define add6 (adder 6))""")
+ w_result = eval_(ctx, "(add6 5)")
assert isinstance(w_result, W_Integer)
assert w_result.to_number() == 11
- w_result = eval_expr(ctx, "((adder 6) 5)")
+ w_result = eval_(ctx, "((adder 6) 5)")
assert isinstance(w_result, W_Integer)
assert w_result.to_number() == 11
def test_lambda_long_body():
ctx = ExecutionContext()
- eval_expr(ctx, """(define long_body (lambda () (define x 42) (+ x 1)))""")
- w_result = eval_expr(ctx, "(long_body)")
+ eval_(ctx, """(define long_body (lambda () (define x 42) (+ x 1)))""")
+ w_result = eval_(ctx, "(long_body)")
assert w_result.to_number() == 43
py.test.raises(UnboundVariable, ctx.get, "x")
def test_lambda_lstarg():
ctx = ExecutionContext()
- w_result = eval_expr(ctx, """((lambda x x) 1 2 3)""")
+ w_result = eval_(ctx, """((lambda x x) 1 2 3)""")
assert isinstance(w_result, W_Pair)
assert w_result.car.to_number() == 1
assert w_result.cdr.car.to_number() == 2
@@ -287,10 +287,10 @@
def test_lambda_dotted_lstarg():
ctx = ExecutionContext()
- w_result = eval_expr(ctx, """((lambda (x y . z) z) 3 4)""")
+ w_result = eval_(ctx, """((lambda (x y . z) z) 3 4)""")
assert w_result is w_nil
- w_result = eval_expr(ctx, """((lambda (x y . z) z) 3 4 5 6)""")
+ w_result = eval_(ctx, """((lambda (x y . z) z) 3 4 5 6)""")
assert isinstance(w_result, W_Pair)
assert w_result.car.to_number() == 5
assert w_result.cdr.car.to_number() == 6
@@ -298,24 +298,24 @@
def test_define_lambda_sugar():
ctx = ExecutionContext()
- eval_expr(ctx, """(define (f x) (+ x 1))""")
- w_result = eval_expr(ctx, "(f 1)")
+ eval_(ctx, """(define (f x) (+ x 1))""")
+ w_result = eval_(ctx, "(f 1)")
assert isinstance(w_result, W_Integer)
assert w_result.to_number() == 2
- eval_expr(ctx, """(define (f2) (+ 1 1))""")
- w_result = eval_expr(ctx, "(f2)")
+ eval_(ctx, """(define (f2) (+ 1 1))""")
+ w_result = eval_(ctx, "(f2)")
assert isinstance(w_result, W_Integer)
assert w_result.to_number() == 2
- eval_expr(ctx, """(define (f3 . x) x)""")
- w_result = eval_expr(ctx, "(f3 1 2)")
+ eval_(ctx, """(define (f3 . x) x)""")
+ w_result = eval_(ctx, "(f3 1 2)")
assert isinstance(w_result, W_Pair)
assert w_result.car.to_number() == 1
assert w_result.cdr.car.to_number() == 2
- eval_expr(ctx, """(define (f4 x . y) x y)""")
- w_result = eval_expr(ctx, "(f4 1 2)")
+ eval_(ctx, """(define (f4 x . y) x y)""")
+ w_result = eval_(ctx, "(f4 1 2)")
assert isinstance(w_result, W_Pair)
assert w_result.car.to_number() == 2
assert w_result.cdr is w_nil
@@ -379,7 +379,7 @@
def test_list():
ctx = ExecutionContext()
ctx.put("var", W_Integer(42))
- w_lst = eval_expr(ctx, "(list 1 var (+ 2 1) 'a)")
+ w_lst = eval_(ctx, "(list 1 var (+ 2 1) 'a)")
assert isinstance(w_lst, W_Pair)
assert w_lst.car.to_number() == 1
assert w_lst.cdr.car.to_number() == 42
@@ -391,7 +391,7 @@
ctx = ExecutionContext()
w_global = W_Integer(0)
ctx.put("var", w_global)
- w_result = eval_expr(ctx, "(begin (set! var 11) (+ var 33))")
+ w_result = eval_(ctx, "(begin (set! var 11) (+ var 33))")
assert w_result.to_number() == 44
assert ctx.get("var").to_number() == 11
@@ -399,11 +399,11 @@
ctx = ExecutionContext()
w_global = W_Integer(0)
ctx.put("var", w_global)
- w_result = eval_expr(ctx, "(let ((var 42) (x (+ 2 var))) (+ var x))")
+ w_result = eval_(ctx, "(let ((var 42) (x (+ 2 var))) (+ var x))")
assert w_result.to_number() == 44
assert ctx.get("var") is w_global
- w_result = eval_expr(ctx, """
+ w_result = eval_(ctx, """
(let ((x (lambda () 1)))
(let ((y (lambda () (x)))
(x (lambda () 2))) (y)))""")
@@ -413,7 +413,7 @@
def test_letrec():
ctx = ExecutionContext()
- w_result = eval_expr(ctx, """
+ w_result = eval_(ctx, """
(letrec ((even?
(lambda (n)
(if (= n 0)
@@ -427,7 +427,7 @@
(even? 2000))""")
assert w_result.to_boolean() is True
- w_result = eval_expr(ctx, """
+ w_result = eval_(ctx, """
(let ((x (lambda () 1)))
(letrec ((y (lambda () (x)))
(x (lambda () 2))) (y)))""")
@@ -493,40 +493,40 @@
def test_delay_promise_force():
ctx = ExecutionContext()
- w_promise = eval_expr(ctx, "(delay (+ 1 2))")
+ w_promise = eval_(ctx, "(delay (+ 1 2))")
assert isinstance(w_promise, W_Promise)
ctx.put("d", w_promise)
- w_promise2 = eval_expr(ctx, "d")
+ w_promise2 = eval_(ctx, "d")
assert w_promise2 is w_promise
- py.test.raises(NotCallable, eval_expr, ctx, "(d)")
+ py.test.raises(NotCallable, eval_, ctx, "(d)")
- w_value = eval_expr(ctx, "(force d)")
+ w_value = eval_(ctx, "(force d)")
assert w_value.to_number() == 3
py.test.raises(WrongArgType, eval_noctx, "(force 'a)")
- eval_expr(ctx, "(define d2 (delay (+ 1 x)))")
- eval_expr(ctx, "(define x 42)")
- w_result = eval_expr(ctx, "(force d2)")
+ eval_(ctx, "(define d2 (delay (+ 1 x)))")
+ eval_(ctx, "(define x 42)")
+ w_result = eval_(ctx, "(force d2)")
assert w_result.to_number() == 43
- eval_expr(ctx, "(set! x 0)")
- w_result = eval_expr(ctx, "(force d2)")
+ eval_(ctx, "(set! x 0)")
+ w_result = eval_(ctx, "(force d2)")
assert w_result.to_number() == 43
def test_lambda_context():
ctx = ExecutionContext()
- eval_expr(ctx, """
+ eval_(ctx, """
(define b (lambda ()
(define lam (lambda () (set! a 42)))
(define a 12)
(lam)
a))
""")
- w_num = eval_expr(ctx, "(b)")
+ w_num = eval_(ctx, "(b)")
assert w_num.to_number() == 42
def test_evaluator():
ctx = ExecutionContext()
- eval_expr(ctx, "(define a 0)")
+ eval_(ctx, "(define a 0)")
w_obj = parse("(let () (set! a 42) a)")[0]
(w_expr, new_ctx) = w_obj.eval_tr(ctx)
assert ctx.get("a").to_number() == 42
@@ -540,43 +540,43 @@
def test_deep_recursion():
ctx = ExecutionContext()
- eval_expr(ctx, "(define a 0)")
- eval_expr(ctx, """
+ eval_(ctx, "(define a 0)")
+ eval_(ctx, """
(define loop (lambda (n)
(set! a (+ a 1))
(if (= n 0)
n
(loop (- n 1)))))""")
- eval_expr(ctx, "(loop 2000)")
+ eval_(ctx, "(loop 2000)")
assert ctx.get("a").to_number() == 2001
def test_setcar():
ctx = ExecutionContext()
- w_pair = eval_expr(ctx, "(define lst '(1 2 3 4))")
- eval_expr(ctx, "(set-car! lst 11)")
- assert w_pair is eval_expr(ctx, "lst")
- assert eval_expr(ctx, "(car lst)").to_number() == 11
+ w_pair = eval_(ctx, "(define lst '(1 2 3 4))")
+ eval_(ctx, "(set-car! lst 11)")
+ assert w_pair is eval_(ctx, "lst")
+ assert eval_(ctx, "(car lst)").to_number() == 11
- eval_expr(ctx, "(set-car! (cdr lst) 12)")
- assert eval_expr(ctx, "(car (cdr lst))").to_number() == 12
+ eval_(ctx, "(set-car! (cdr lst) 12)")
+ assert eval_(ctx, "(car (cdr lst))").to_number() == 12
def test_setcdr():
ctx = ExecutionContext()
- w_pair = eval_expr(ctx, "(define lst '(1 2 3 4))")
- eval_expr(ctx, "(set-cdr! lst (cdr (cdr lst)))")
- w_lst = eval_expr(ctx, "lst")
+ w_pair = eval_(ctx, "(define lst '(1 2 3 4))")
+ eval_(ctx, "(set-cdr! lst (cdr (cdr lst)))")
+ w_lst = eval_(ctx, "lst")
assert w_pair is w_lst
assert w_lst.to_string() == "(1 3 4)"
- eval_expr(ctx, "(set-cdr! (cdr lst) '(12))")
- w_lst = eval_expr(ctx, "lst")
+ eval_(ctx, "(set-cdr! (cdr lst) '(12))")
+ w_lst = eval_(ctx, "lst")
assert w_lst.to_string() == "(1 3 12)"
#warning circural list
- eval_expr(ctx, "(set-cdr! (cdr (cdr lst)) lst)")
- w_lst = eval_expr(ctx, "lst")
- assert w_lst is eval_expr(ctx, "(cdr (cdr (cdr lst)))")
+ eval_(ctx, "(set-cdr! (cdr (cdr lst)) lst)")
+ w_lst = eval_(ctx, "lst")
+ assert w_lst is eval_(ctx, "(cdr (cdr (cdr lst)))")
def test_quasiquote():
w_res = eval_noctx("(quasiquote (list (unquote (+ 1 2)) 4))")
@@ -632,3 +632,30 @@
assert w_res.to_string() == \
"(1 (quasiquote (2 (unquote-splicing (list 3 4 5 6 7)))))"
+def test_nil_eval():
+ ctx = ExecutionContext()
+ py.test.raises(SchemeSyntaxError, eval_, ctx, "()")
+
+def test_type_predicates():
+ ctx = ExecutionContext()
+
+ assert eval_(ctx, "(pair? 1)").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
+ assert eval_(ctx, "(pair? '(1))").to_boolean() is True
+ assert eval_(ctx, "(pair? (list 1))").to_boolean() is True
+ assert eval_(ctx, "(pair? (cons 1 2))").to_boolean() is True
+
+ assert eval_(ctx, "(procedure? 1)").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
+ assert eval_(ctx, "(procedure? (cons 1 2))").to_boolean() is False
+ assert eval_(ctx, "(procedure? +)").to_boolean() is True
+ assert eval_(ctx, "(procedure? (lambda () 1))").to_boolean() is True
+
+def test_eq():
+ #XXX must be added soon!
+ py.test.skip("to lazy to write it now")
+
Modified: pypy/dist/pypy/lang/scheme/test/test_macro.py
==============================================================================
--- pypy/dist/pypy/lang/scheme/test/test_macro.py (original)
+++ pypy/dist/pypy/lang/scheme/test/test_macro.py Tue Aug 14 18:19:43 2007
@@ -464,9 +464,10 @@
assert w_result.to_number() == 4
def test_pitfall_3_2():
- py.test.skip("(cond ...) not implemented yet")
+ ctx = ExecutionContext()
+
#define inside macors can and sometimes can not introduce new binding
- w_result = eval_noctx("""(let-syntax ((foo (syntax-rules ()
+ w_result = eval_(ctx, """(let-syntax ((foo (syntax-rules ()
((_ var) (define var 1)))))
(let ((x 2))
(begin (define foo +))
More information about the Pypy-commit
mailing list