Add hex and octel support to Hy integers
This allows us to parse things like 0xDEADBEEF or 0o080. Filed as issue #937
This commit is contained in:
parent
2e1b2ff591
commit
e05514bb4e
@ -19,7 +19,7 @@
|
||||
# DEALINGS IN THE SOFTWARE.
|
||||
|
||||
from hy.models import HyObject, _wrappers
|
||||
from hy._compat import long_type
|
||||
from hy._compat import long_type, str_type
|
||||
|
||||
import sys
|
||||
|
||||
@ -32,6 +32,18 @@ class HyInteger(HyObject, long_type):
|
||||
"""
|
||||
|
||||
def __new__(cls, number, *args, **kwargs):
|
||||
if isinstance(number, str_type):
|
||||
bases = {"0x": 16, "0o": 8, "0b": 2}
|
||||
for leader, base in bases.items():
|
||||
if number.startswith(leader):
|
||||
# We've got a string, known leader, set base.
|
||||
number = long_type(number, base=base)
|
||||
break
|
||||
else:
|
||||
# We've got a string, no known leader; base 10.
|
||||
number = long_type(number, base=10)
|
||||
else:
|
||||
# We've got a non-string; convert straight.
|
||||
number = long_type(number)
|
||||
return super(HyInteger, cls).__new__(cls, number)
|
||||
|
||||
|
@ -12,6 +12,21 @@
|
||||
(assert (isinstance sys.argv list)))
|
||||
|
||||
|
||||
(defn test-hex []
|
||||
"NATIVE: test hex"
|
||||
(assert (= 0x80 128)))
|
||||
|
||||
|
||||
(defn test-octal []
|
||||
"NATIVE: test octal"
|
||||
(assert (= 0o1232 666)))
|
||||
|
||||
|
||||
(defn test-binary []
|
||||
"NATIVE: test binary"
|
||||
(assert (= 0b1011101 93)))
|
||||
|
||||
|
||||
(defn test-fractions []
|
||||
"NATIVE: test fractions"
|
||||
(assert (= 1/2 (fraction 1 2))))
|
||||
|
Loading…
x
Reference in New Issue
Block a user