[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