From 784a44601b63357d28ff150d072bf90a524f9432 Mon Sep 17 00:00:00 2001 From: Kodi Arfer Date: Wed, 19 Jul 2017 10:18:55 -0700 Subject: [PATCH] Remove the implementation of `apply` --- NEWS | 2 + hy/compiler.py | 109 ------------------------------------------------- 2 files changed, 2 insertions(+), 109 deletions(-) diff --git a/NEWS b/NEWS index fe7ffb9..3bae0ca 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,8 @@ Changes from 0.13.0 [ Language Changes ] * `yield-from` is no longer supported under Python 2 + * `apply` has been replaced with Python-style unpacking operators `#*` and + `#**` (e.g., `(f #* args #** kwargs)`) * Single-character "sharp macros" changed to "tag macros", which can have longer names * Periods are no longer allowed in keywords diff --git a/hy/compiler.py b/hy/compiler.py index 97a4c73..5fd073f 100755 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -1587,115 +1587,6 @@ class HyASTCompiler(object): generators=expr.generators) return ret - @builds("apply") - @checkargs(min=1, max=3) - def compile_apply_expression(self, expr): - expr.pop(0) # apply - - ret = Result() - - fun = expr.pop(0) - - # We actually defer the compilation of the function call to - # @builds(HyExpression), allowing us to work on method calls - call = HyExpression([fun]).replace(fun) - - if isinstance(fun, HySymbol) and fun.startswith("."): - # (apply .foo lst) needs to work as lst[0].foo(*lst[1:]) - if not expr: - raise HyTypeError( - expr, "apply of a method needs to have an argument" - ) - - # We need to grab the arguments, and split them. - - # Assign them to a variable if they're not one already - if type(expr[0]) == HyList: - if len(expr[0]) == 0: - raise HyTypeError( - expr, "apply of a method needs to have an argument" - ) - call.append(expr[0].pop(0)) - else: - if isinstance(expr[0], HySymbol): - tempvar = expr[0] - else: - tempvar = HySymbol(self.get_anon_var()).replace(expr[0]) - assignment = HyExpression( - [HySymbol("setv"), tempvar, expr[0]] - ).replace(expr[0]) - - # and add the assignment to our result - ret += self.compile(assignment) - - # The first argument is the object on which to call the method - # So we translate (apply .foo args) to (.foo (get args 0)) - call.append(HyExpression( - [HySymbol("get"), tempvar, HyInteger(0)] - ).replace(tempvar)) - - # We then pass the other arguments to the function - expr[0] = HyExpression( - [HySymbol("cut"), tempvar, HyInteger(1)] - ).replace(expr[0]) - - ret += self.compile(call) - - if not isinstance(ret.expr, ast.Call): - raise HyTypeError( - fun, "compiling the application of `{}' didn't return a " - "function call, but `{}'".format(fun, type(ret.expr).__name__) - ) - if ret.expr.starargs or ret.expr.kwargs: - raise HyTypeError( - expr, "compiling the function application returned a function " - "call with arguments" - ) - - if expr: - stargs = expr.pop(0) - if stargs is not None: - stargs = self.compile(stargs) - if PY35: - stargs_expr = stargs.force_expr - ret.expr.args.append( - ast.Starred(stargs_expr, ast.Load(), - lineno=stargs_expr.lineno, - col_offset=stargs_expr.col_offset) - ) - else: - ret.expr.starargs = stargs.force_expr - ret = stargs + ret - - if expr: - kwargs = expr.pop(0) - if isinstance(kwargs, HyDict): - new_kwargs = [] - for k, v in kwargs.items(): - if isinstance(k, HySymbol): - pass - elif isinstance(k, HyString): - k = HyString(hy_symbol_mangle(str_type(k))).replace(k) - elif isinstance(k, HyKeyword): - sym = hy_symbol_mangle(str_type(k)[2:]) - k = HyString(sym).replace(k) - new_kwargs += [k, v] - kwargs = HyDict(new_kwargs).replace(kwargs) - - kwargs = self.compile(kwargs) - if PY35: - kwargs_expr = kwargs.force_expr - ret.expr.keywords.append( - ast.keyword(None, kwargs_expr, - lineno=kwargs_expr.lineno, - col_offset=kwargs_expr.col_offset) - ) - else: - ret.expr.kwargs = kwargs.force_expr - ret = kwargs + ret - - return ret - @builds("not") @builds("~") @checkargs(1)