diff --git a/hy/compiler.py b/hy/compiler.py index f0b6388..0f7b452 100644 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -546,6 +546,21 @@ class HyASTCompiler(object): lineno=operator.start_line, col_offset=operator.start_column) + @builds("and") + @builds("or") + @checkargs(min=2) + def compile_logical_or_and_and_operator(self, expression): + ops = {"and": ast.And, + "or": ast.Or} + operator = expression.pop(0) + values = [] + for child in expression: + values.append (self.compile(child)) + return ast.BoolOp(op=ops[operator](), + lineno=operator.start_line, + col_offset=operator.start_column, + values=values) + @builds("=") @builds("!=") @builds("<") diff --git a/tests/native_tests/language.hy b/tests/native_tests/language.hy index 1044c41..9eaf0f5 100644 --- a/tests/native_tests/language.hy +++ b/tests/native_tests/language.hy @@ -406,6 +406,22 @@ (assert (= -_- "what?")))) +(defn test-and [] + "NATIVE: test the and function" + (let [[and123 (and 1 2 3)] + [and-false (and 1 False 3)]] + (assert (= and123 3)) + (assert (= and-false False)))) + +(defn test-or [] + "NATIVE: test the or function" + (let [[or-all-true (or 1 2 3 True "string")] + [or-some-true (or False "hello")] + [or-none-true (or False False)]] + (assert (= or-all-true 1)) + (assert (= or-some-true "hello")) + (assert (= or-none-true False)))) + ; FEATURE: native hy-eval ; ; - related to bug #64