From 5c6d98a24a36eb0695fb62eac39a45de428df37e Mon Sep 17 00:00:00 2001 From: "Paul R. Tagliamonte" Date: Thu, 28 Feb 2013 22:37:23 -0500 Subject: [PATCH] Rebuilding. --- hy/lex/__init__.py | 2 +- hy/lex/states.py | 11 +++++++++-- hy/models/__init__.py | 4 ++++ hy/models/expression.py | 5 +++++ hy/models/string.py | 14 ++++++++++++++ hy/models/symbol.py | 10 ++++++++++ tests/test_lex.py | 3 +++ 7 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 hy/models/__init__.py create mode 100644 hy/models/expression.py create mode 100644 hy/models/string.py create mode 100644 hy/models/symbol.py diff --git a/hy/lex/__init__.py b/hy/lex/__init__.py index 9717fdf..7b61762 100644 --- a/hy/lex/__init__.py +++ b/hy/lex/__init__.py @@ -4,4 +4,4 @@ from hy.lex.states import Idle def tokenize(buf): machine = Machine(Idle, 0, 0) machine.process(buf) - print machine.nodes + return machine.nodes diff --git a/hy/lex/states.py b/hy/lex/states.py index 180f5ad..d30346c 100644 --- a/hy/lex/states.py +++ b/hy/lex/states.py @@ -1,5 +1,8 @@ +from hy.models.expression import HyExpression +from hy.models.symbol import HySymbol from hy.errors import HyError + WHITESPACE = [" ", "\t", "\n", "\r"] @@ -7,6 +10,10 @@ class LexException(HyError): pass +def _resolve_atom(obj): + return HySymbol(obj) + + class State(object): __slots__ = ("machine",) @@ -26,12 +33,12 @@ class Expression(State): self.buf = "" def commit(self): - self.nodes.append(self.buf) + self.nodes.append(_resolve_atom(self.buf)) self.buf = "" def exit(self): self.commit() - self.machine.nodes.append(self.nodes) + self.machine.nodes.append(HyExpression(self.nodes)) def process(self, char): if char == ")": diff --git a/hy/models/__init__.py b/hy/models/__init__.py new file mode 100644 index 0000000..dbd8f13 --- /dev/null +++ b/hy/models/__init__.py @@ -0,0 +1,4 @@ + + +class HyObject(object): + pass diff --git a/hy/models/expression.py b/hy/models/expression.py new file mode 100644 index 0000000..aa5bea3 --- /dev/null +++ b/hy/models/expression.py @@ -0,0 +1,5 @@ +from hy.models import HyObject + + +class HyExpression(HyObject, list): + pass diff --git a/hy/models/string.py b/hy/models/string.py new file mode 100644 index 0000000..dc0d936 --- /dev/null +++ b/hy/models/string.py @@ -0,0 +1,14 @@ +from hy.models import HyObject +import sys + + +if sys.version_info[0] >= 3: + _str_type = str +else: + _str_type = unicode + + +class HyString(HyObject, _str_type): + def __new__(cls, value): + obj = _str_type.__new__(cls, value) + return obj diff --git a/hy/models/symbol.py b/hy/models/symbol.py new file mode 100644 index 0000000..4a497c1 --- /dev/null +++ b/hy/models/symbol.py @@ -0,0 +1,10 @@ +from hy.models.string import HyString + + +class HySymbol(HyString): + def __init__(self, string): + self += string + + def eval(self, lns, *args, **kwargs): + obj = self.lookup(lns, self) + return obj diff --git a/tests/test_lex.py b/tests/test_lex.py index b5b4668..e0c80c0 100644 --- a/tests/test_lex.py +++ b/tests/test_lex.py @@ -1,5 +1,8 @@ from hy.lex import tokenize +from hy.models.expression import HyExpression +from hy.models.symbol import HySymbol def test_lex_expression(): objs = tokenize("(foo bar)") + assert objs == [HyExpression([HySymbol("foo"), HySymbol("bar")])]