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

jlg at codespeak.net jlg at codespeak.net
Wed Jul 18 15:23:05 CEST 2007


Author: jlg
Date: Wed Jul 18 15:23:04 2007
New Revision: 45183

Modified:
   pypy/dist/pypy/lang/scheme/TODO.txt
   pypy/dist/pypy/lang/scheme/object.py
   pypy/dist/pypy/lang/scheme/ssparser.py
   pypy/dist/pypy/lang/scheme/test/test_eval.py
   pypy/dist/pypy/lang/scheme/test/test_parser.py
Log:
quasiquotations parsing

Modified: pypy/dist/pypy/lang/scheme/TODO.txt
==============================================================================
--- pypy/dist/pypy/lang/scheme/TODO.txt	(original)
+++ pypy/dist/pypy/lang/scheme/TODO.txt	Wed Jul 18 15:23:04 2007
@@ -20,7 +20,7 @@
 
 Here starts the real fun!
 
-- quasi-quotations
+- quasi-quotations: unquote-splicing
 - macros
 - continuations
 - move syntax checking to parsing

Modified: pypy/dist/pypy/lang/scheme/object.py
==============================================================================
--- pypy/dist/pypy/lang/scheme/object.py	(original)
+++ pypy/dist/pypy/lang/scheme/object.py	Wed Jul 18 15:23:04 2007
@@ -688,9 +688,18 @@
 
         return self.eval_body(local_ctx, lst.cdr)
 
-def literal(sexpr):
+def quote(sexpr):
     return W_Pair(W_Identifier('quote'), W_Pair(sexpr, W_Nil()))
 
+def qq(sexpr):
+    return W_Pair(W_Identifier('quasiquote'), W_Pair(sexpr, W_Nil()))
+
+def unquote(sexpr):
+    return W_Pair(W_Identifier('unquote'), W_Pair(sexpr, W_Nil()))
+
+def unquote_splicing(sexpr):
+    return W_Pair(W_Identifier('unquote-splicing'), W_Pair(sexpr, W_Nil()))
+
 class Quote(W_Macro):
     def call(self, ctx, lst):
         if not isinstance(lst, W_Pair):

Modified: pypy/dist/pypy/lang/scheme/ssparser.py
==============================================================================
--- pypy/dist/pypy/lang/scheme/ssparser.py	(original)
+++ pypy/dist/pypy/lang/scheme/ssparser.py	Wed Jul 18 15:23:04 2007
@@ -2,9 +2,9 @@
 from pypy.rlib.parsing.pypackrat import PackratParser
 from pypy.rlib.parsing.makepackrat import BacktrackException, Status
 from pypy.lang.scheme.object import W_Pair, W_Integer, W_String, W_Identifier, \
-        W_Nil, W_Boolean, W_Real, literal
+        W_Nil, W_Boolean, W_Real, quote, qq, unquote, unquote_splicing
 
-def unquote(s):
+def str_unquote(s):
     str_lst = []
     last_ch = ''
     for c in s[1:]:
@@ -22,7 +22,7 @@
     STRING:
         c = `\"([^\\\"]|\\\"|\\\\)*\"`
         IGNORE*
-        return {W_String(unquote(c))};
+        return {W_String(str_unquote(c))};
 
     IDENTIFIER:
         c = `[\+\-\*\^\?a-zA-Z!<=>_~/$%&:][\+\-\*\^\?a-zA-Z0-9!<=>_~/$%&:]*`
@@ -56,14 +56,33 @@
         EOF
         return {s};
     
-    literal:
+    quote:
        `'`
        s = sexpr
-       return {literal(s)};
+       return {quote(s)};
+    
+    qq:
+       `\``
+       s = sexpr
+       return {qq(s)};
+       
+       
+    unquote_splicing:
+       `\,@`
+       s = sexpr
+       return {unquote_splicing(s)};
+
+    unquote:
+       `\,`
+       s = sexpr
+       return {unquote(s)};
     
     sexpr:
         list
-      | literal
+      | quote
+      | qq
+      | unquote_splicing
+      | unquote
       | FLOAT
       | FIXNUM
       | BOOLEAN

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	Wed Jul 18 15:23:04 2007
@@ -591,7 +591,7 @@
                                 e))
                             f))""")
     assert w_res.to_string() == \
-            "(a (quasiquote (b (unquote (+ 1 2)) (unquote (foo 4 d)) e)) f)"
+        "(a (quasiquote (b (unquote (+ 1 2)) (unquote (foo 4 d)) e)) f)"
 
     w_res = eval_noctx("""
                 (let ((name1 'x)
@@ -603,5 +603,6 @@
                                                         (unquote name2)))
                                              d))
                                  e)))""")
-    assert w_res.to_string() == "(a (quasiquote (b (unquote x) (unquote (quote y)) d)) e)"
+    assert w_res.to_string() == \
+        "(a (quasiquote (b (unquote x) (unquote (quote y)) d)) e)"
 

Modified: pypy/dist/pypy/lang/scheme/test/test_parser.py
==============================================================================
--- pypy/dist/pypy/lang/scheme/test/test_parser.py	(original)
+++ pypy/dist/pypy/lang/scheme/test/test_parser.py	Wed Jul 18 15:23:04 2007
@@ -126,3 +126,32 @@
     t = parse_sexpr("(1 2 . (3 4))")
     assert unwrap(t) == [1, 2, 3, 4]
 
+def test_quote():
+    t = parse_sexpr("'a")
+    assert unwrap(t) == ['quote', 'a']
+
+    t = parse_sexpr("'(1 '2 3)")
+    assert unwrap(t) == ['quote', [1, ['quote', 2], 3]]
+
+def test_qq():
+    t = parse_sexpr("`a")
+    assert unwrap(t) == ['quasiquote', 'a']
+
+    t = parse_sexpr("`(1 `2 3)")
+    assert unwrap(t) == ['quasiquote', [1, ['quasiquote', 2], 3]]
+
+def test_unquote():
+    t = parse_sexpr(",a")
+    assert unwrap(t) == ['unquote', 'a']
+
+    t = parse_sexpr(",(1 ,2 3)")
+    assert unwrap(t) == ['unquote', [1, ['unquote', 2], 3]]
+
+def test_unquote_splicing():
+    t = parse_sexpr(", at a")
+    assert unwrap(t) == ['unquote-splicing', 'a']
+
+    t = parse_sexpr(",@(list , at b 3)")
+    assert unwrap(t) == ['unquote-splicing', ['list',
+                                ['unquote-splicing', 'b'], 3]]
+



More information about the Pypy-commit mailing list