diff --git a/hy/lex/states.py b/hy/lex/states.py index 348f77f..5cfe035 100644 --- a/hy/lex/states.py +++ b/hy/lex/states.py @@ -1,6 +1,8 @@ from hy.models.expression import HyExpression +from hy.models.integer import HyInteger from hy.models.symbol import HySymbol from hy.models.string import HyString + from hy.errors import HyError @@ -12,6 +14,11 @@ class LexException(HyError): def _resolve_atom(obj): + try: + return HyInteger(obj) + except ValueError: + pass + return HySymbol(obj) diff --git a/hy/models/integer.py b/hy/models/integer.py new file mode 100644 index 0000000..98c5309 --- /dev/null +++ b/hy/models/integer.py @@ -0,0 +1,7 @@ +from hy.models import HyObject + + +class HyInteger(HyObject, int): + def __new__(cls, number, *args, **kwargs): + number = int(number) + return super(HyInteger, cls).__new__(cls, number) diff --git a/tests/test_lex.py b/tests/test_lex.py index 6cb2a48..6806d53 100644 --- a/tests/test_lex.py +++ b/tests/test_lex.py @@ -1,8 +1,10 @@ -from hy.lex import tokenize from hy.models.expression import HyExpression +from hy.models.integer import HyInteger from hy.models.symbol import HySymbol from hy.models.string import HyString +from hy.lex import tokenize + def test_lex_expression_symbols(): objs = tokenize("(foo bar)") @@ -11,3 +13,7 @@ def test_lex_expression_symbols(): def test_lex_expression_strings(): objs = tokenize("(foo \"bar\")") assert objs == [HyExpression([HySymbol("foo"), HyString("bar")])] + +def test_lex_expression_integer(): + objs = tokenize("(foo 2)") + assert objs == [HyExpression([HySymbol("foo"), HyInteger(2)])]