[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