diff --git a/docs/language/api.rst b/docs/language/api.rst index 2598b57..9934b4d 100644 --- a/docs/language/api.rst +++ b/docs/language/api.rst @@ -378,6 +378,39 @@ between the operands. => (infix (1 + 1)) 2 +del +--- + +.. versionadded:: 0.9.12 + +`del` removes an object from the current namespace. + +.. code-block:: clj + + => (setv foo 42) + => (del foo) + => foo + Traceback (most recent call last): + File "", line 1, in + NameError: name 'foo' is not defined + +`del` can also remove objects from a mapping, a list, ... + +.. code-block:: clj + + => (setv test (list (range 10))) + => test + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + => (del (slice test 2 4)) ;; remove items from 2 to 4 excluded + => test + [0, 1, 4, 5, 6, 7, 8, 9] + => (setv dic {"foo" "bar"}) + => dic + {"foo": "bar"} + => (del (get dic "foo")) + => dic + {} + eval ---- diff --git a/hy/compiler.py b/hy/compiler.py index 90550bd..b716d31 100644 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -1099,6 +1099,21 @@ class HyASTCompiler(object): slice=ast.Index(value=sli.force_expr), ctx=ast.Load()) + @builds("del") + @checkargs(min=1) + def compile_del_expression(self, expr): + expr.pop(0) + ld_targets, ret = self._compile_collect(expr) + + del_targets = [] + for target in ld_targets: + del_targets.append(self._storeize(target, ast.Del)) + + return ret + ast.Delete( + lineno=expr.start_line, + col_offset=expr.start_column, + targets=del_targets) + @builds("slice") @checkargs(min=1, max=4) def compile_slice_expression(self, expr): diff --git a/tests/native_tests/language.hy b/tests/native_tests/language.hy index 4d841a0..ca1de7d 100644 --- a/tests/native_tests/language.hy +++ b/tests/native_tests/language.hy @@ -789,3 +789,18 @@ (assert (string? (string "a"))) (assert (string? (string 1))) (assert (= u"unicode" (string "unicode")))) + +(defn test-del [] + "NATIVE: Test the behavior of del" + (setv foo 42) + (assert (= foo 42)) + (del foo) + (assert (= 'good + (try + (do foo 'bad) + (except [NameError] 'good)))) + (setv test (list (range 5))) + (del (get test 4)) + (assert (= test [0 1 2 3])) + (del (get test 2)) + (assert (= test [0 1 3])))