[pypy-svn] r44633 - in pypy/dist/pypy/lang/scheme: . test
jlg at codespeak.net
jlg at codespeak.net
Fri Jun 29 23:11:45 CEST 2007
Author: jlg
Date: Fri Jun 29 23:11:45 2007
New Revision: 44633
Modified:
pypy/dist/pypy/lang/scheme/object.py
pypy/dist/pypy/lang/scheme/test/test_eval.py
Log:
cons car cdr works in simple cases
Modified: pypy/dist/pypy/lang/scheme/object.py
==============================================================================
--- pypy/dist/pypy/lang/scheme/object.py (original)
+++ pypy/dist/pypy/lang/scheme/object.py Fri Jun 29 23:11:45 2007
@@ -209,18 +209,46 @@
def eval(self, ctx):
return macro_if
+def cons(ctx, lst):
+ w_car = lst.car.eval(ctx)
+ w_cdr = lst.cdr.car.eval(ctx)
+ return W_Pair(w_car, w_cdr)
+
+class Cons(W_Procedure):
+ def eval(self, ctx):
+ return cons
+
+def car(ctx, lst):
+ w_pair = lst.car.eval(ctx)
+ return w_pair.car
+
+class Car(W_Procedure):
+ def eval(self, ctx):
+ return car
+
+def cdr(ctx, lst):
+ w_pair = lst.car.eval(ctx)
+ return w_pair.cdr
+
+class Cdr(W_Procedure):
+ def eval(self, ctx):
+ return cdr
+
######################################
# dict mapping operations to callables
# callables must have 2 arguments
# - ctx = execution context
# - lst = list of arguments
-#######################################
+######################################
OPERATION_MAP = \
{
'+': Add("+"),
'*': Mul("*"),
'define': Define("define"),
'if': MacroIf("if"),
+ 'cons': Cons("cons"),
+ 'car': Car("car"),
+ 'cdr': Cdr("cdr"),
}
class ExecutionContext(object):
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 Jun 29 23:11:45 2007
@@ -112,3 +112,29 @@
assert ctx.get("then").to_boolean() is False
assert ctx.get("else").to_boolean() is True
+def test_cons_simple():
+ w_pair = eval_noctx("(cons 1 2)")
+ assert isinstance(w_pair, W_Pair)
+ assert w_pair.car.to_number() == 1
+ assert w_pair.cdr.to_number() == 2
+
+ w_pair = eval_noctx("(cons 1 (cons 2 3))")
+ assert isinstance(w_pair, W_Pair)
+ assert isinstance(w_pair.cdr, W_Pair)
+ assert w_pair.car.to_number() == 1
+ assert w_pair.cdr.car.to_number() == 2
+ assert w_pair.cdr.cdr.to_number() == 3
+
+def test_car_simple():
+ w_car = eval_noctx("(car (cons 1 2))")
+ assert w_car.to_number() == 1
+
+ w_cdr = eval_noctx("(cdr (cons 1 2))")
+ assert w_cdr.to_number() == 2
+
+ w_cadr = eval_noctx("(car (cdr (cons 1 (cons 2 3))))")
+ assert w_cadr.to_number() == 2
+
+ w_cddr = eval_noctx("(cdr (cdr (cons 1 (cons 2 3))))")
+ assert w_cddr.to_number() == 3
+
More information about the Pypy-commit
mailing list