Add missing bits operator and power

Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
Julien Danjou 2013-04-14 17:37:18 +02:00
parent 403be35aa3
commit 60a9003b0c
3 changed files with 38 additions and 6 deletions

View File

@ -716,18 +716,26 @@ class HyASTCompiler(object):
@builds("/") @builds("/")
@builds("//") @builds("//")
@builds("*") @builds("*")
@builds("**")
@builds("<<")
@builds(">>")
@builds("|")
@builds("^")
@builds("&")
@checkargs(min=2) @checkargs(min=2)
def compile_maths_expression(self, expression): def compile_maths_expression(self, expression):
# operator = Mod | Pow | LShift | RShift | BitOr |
# BitXor | BitAnd | FloorDiv
# (to implement list) XXX
ops = {"+": ast.Add, ops = {"+": ast.Add,
"/": ast.Div, "/": ast.Div,
"//": ast.FloorDiv, "//": ast.FloorDiv,
"*": ast.Mult, "*": ast.Mult,
"-": ast.Sub, "-": ast.Sub,
"%": ast.Mod} "%": ast.Mod,
"**": ast.Pow,
"<<": ast.LShift,
">>": ast.RShift,
"|": ast.BitOr,
"^": ast.BitXor,
"&": ast.BitAnd}
inv = expression.pop(0) inv = expression.pop(0)
op = ops[inv] op = ops[inv]

View File

@ -79,7 +79,7 @@ def _resolve_atom(obj):
if obj.startswith(":"): if obj.startswith(":"):
return HyKeyword(obj) return HyKeyword(obj)
if obj.startswith("*") and obj.endswith("*") and obj != "*": if obj.startswith("*") and obj.endswith("*") and obj not in ("*", "**"):
obj = obj[1:-1].upper() obj = obj[1:-1].upper()
if "-" in obj and obj != "-": if "-" in obj and obj != "-":

View File

@ -39,3 +39,27 @@
(defn test-modulo [] (defn test-modulo []
"NATIVE: test mod" "NATIVE: test mod"
(assert (= (% 10 2) 0))) (assert (= (% 10 2) 0)))
(defn test-pow []
"NATIVE: test pow"
(assert (= (** 10 2) 100)))
(defn test-lshift []
"NATIVE: test lshift"
(assert (= (<< 1 2) 4)))
(defn test-rshift []
"NATIVE: test lshift"
(assert (= (>> 8 1) 4)))
(defn test-bitor []
"NATIVE: test lshift"
(assert (= (| 1 2) 3)))
(defn test-bitxor []
"NATIVE: test xor"
(assert (= (^ 1 2) 3)))
(defn test-bitand []
"NATIVE: test lshift"
(assert (= (& 1 2) 0)))