diff --git a/AUTHORS b/AUTHORS index 4fae5f8..ffdeee9 100644 --- a/AUTHORS +++ b/AUTHORS @@ -7,3 +7,4 @@ * Julien Danjou * Nicolas Dandrimont * Gergely Nagy +* Konrad Hinsen diff --git a/bin/hy b/bin/hy index 4167e68..2e27f56 100755 --- a/bin/hy +++ b/bin/hy @@ -48,7 +48,12 @@ class HyREPL(code.InteractiveConsole): _machine = Machine(Idle, 1, 0) return True - tokens = process(_machine.nodes) + try: + tokens = process(_machine.nodes) + except Exception: + _machine = Machine(Idle, 1, 0) + self.showtraceback() + return False _machine = Machine(Idle, 1, 0) try: diff --git a/hy/__init__.py b/hy/__init__.py index f25dd2f..56ffb1d 100644 --- a/hy/__init__.py +++ b/hy/__init__.py @@ -25,3 +25,10 @@ __version__ = "0.9.5" import hy.importer # NOQA # we import for side-effects. + +from hy.models.expression import HyExpression # NOQA +from hy.models.integer import HyInteger # NOQA +from hy.models.string import HyString # NOQA +from hy.models.symbol import HySymbol # NOQA +from hy.models.dict import HyDict # NOQA +from hy.models.list import HyList # NOQA diff --git a/hy/compiler.py b/hy/compiler.py index 39804a2..0157142 100644 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -83,8 +83,7 @@ def builds(_type): def _raise_wrong_args_number(expression, error): - err = TypeError(error % (expression.pop(0), - len(expression))) + err = TypeError(error % (expression.pop(0), len(expression))) err.start_line = expression.start_line err.start_column = expression.start_column raise err @@ -94,9 +93,8 @@ def checkargs(exact=None, min=None, max=None): def _dec(fn): def checker(self, expression): if exact is not None and (len(expression) - 1) != exact: - _raise_wrong_args_number(expression, - "`%%s' needs %d arguments, got %%d" % - exact) + _raise_wrong_args_number( + expression, "`%%s' needs %d arguments, got %%d" % exact) if min is not None and (len(expression) - 1) < min: _raise_wrong_args_number( @@ -140,8 +138,7 @@ class HyASTCompiler(object): def _mangle_branch(self, tree, start_line, start_column): # If tree is empty, just return a pass statement if tree == []: - return [ast.Pass(lineno=start_line, - col_offset=start_column)] + return [ast.Pass(lineno=start_line, col_offset=start_column)] ret = [] tree = list(flatten_literal_list(tree)) @@ -166,9 +163,10 @@ class HyASTCompiler(object): ret.append(el) continue - ret.append(ast.Expr(value=el, - lineno=el.lineno, - col_offset=el.col_offset)) + ret.append(ast.Expr( + value=el, + lineno=el.lineno, + col_offset=el.col_offset)) ret.reverse() return ret @@ -177,6 +175,22 @@ class HyASTCompiler(object): def compile_raw_list(self, entries): return [self.compile(x) for x in entries] + def _render_quoted_form(self, form): + name = form.__class__.__name__ + if isinstance(form, HyList): + return HyExpression( + [HySymbol(name), + HyList([self._render_quoted_form(x) for x in form])] + ).replace(form) + elif isinstance(form, HySymbol): + return HyExpression([HySymbol(name), HyString(form)]).replace(form) + return HyExpression([HySymbol(name), form]).replace(form) + + @builds("quote") + @checkargs(exact=1) + def compile_quote(self, entries): + return self.compile(self._render_quoted_form(entries[1])) + @builds("do") @builds("progn") def compile_do_expression(self, expr): diff --git a/hy/models/__init__.py b/hy/models/__init__.py index 408c917..775862a 100644 --- a/hy/models/__init__.py +++ b/hy/models/__init__.py @@ -34,3 +34,5 @@ class HyObject(object): setattr(self, attr, getattr(other, attr)) else: raise TypeError("Can't replace a non Hy object with a Hy object") + + return self diff --git a/hy/models/list.py b/hy/models/list.py index f92bff9..183ec42 100644 --- a/hy/models/list.py +++ b/hy/models/list.py @@ -31,6 +31,7 @@ class HyList(HyObject, list): x.replace(other) HyObject.replace(self, other) + return self def __repr__(self): return "[%s]" % (" ".join([str(x) for x in self])) diff --git a/tests/compilers/native/__init__.hy b/tests/compilers/native/__init__.hy new file mode 100644 index 0000000..e69de29 diff --git a/tests/compilers/native/quoting.hy b/tests/compilers/native/quoting.hy new file mode 100644 index 0000000..6a1b522 --- /dev/null +++ b/tests/compilers/native/quoting.hy @@ -0,0 +1,10 @@ +;;; +;;; + +(import-from hy HyExpression HySymbol HyString) + + +(defn test-basic-quoting [] + (assert (= (type (quote (foo bar))) HyExpression)) + (assert (= (type (quote foo)) HySymbol)) + (assert (= (type (quote "string")) HyString))) diff --git a/tests/compilers/test_quoting.py b/tests/compilers/test_quoting.py new file mode 100644 index 0000000..fb83d8d --- /dev/null +++ b/tests/compilers/test_quoting.py @@ -0,0 +1 @@ +from .native.quoting import * # NOQA