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.
|
# DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
from hy.models import HyObject, _wrappers
|
from hy.models import HyObject, _wrappers
|
||||||
from hy._compat import long_type
|
from hy._compat import long_type, str_type
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
@ -32,7 +32,19 @@ class HyInteger(HyObject, long_type):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
def __new__(cls, number, *args, **kwargs):
|
def __new__(cls, number, *args, **kwargs):
|
||||||
number = long_type(number)
|
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)
|
return super(HyInteger, cls).__new__(cls, number)
|
||||||
|
|
||||||
|
|
||||||
|
@ -12,6 +12,21 @@
|
|||||||
(assert (isinstance sys.argv list)))
|
(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 []
|
(defn test-fractions []
|
||||||
"NATIVE: test fractions"
|
"NATIVE: test fractions"
|
||||||
(assert (= 1/2 (fraction 1 2))))
|
(assert (= 1/2 (fraction 1 2))))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user