def test_lex_digit_separators(): assert tokenize("1_000_000") == [Integer(1000000)] assert tokenize("1,000,000") == [Integer(1000000)] assert tokenize("1,000_000") == [Integer(1000000)] assert tokenize("1_000,000") == [Integer(1000000)] assert tokenize("0x_af") == [Integer(0xaf)] assert tokenize("0x,af") == [Integer(0xaf)] assert tokenize("0b_010") == [Integer(0b010)] assert tokenize("0b,010") == [Integer(0b010)] assert tokenize("0o_373") == [Integer(0o373)] assert tokenize("0o,373") == [Integer(0o373)] assert tokenize('1_2.3,4') == [Float(12.34)] assert tokenize('1_2e3,4') == [Float(12e34)] assert (tokenize("1,2/3_4") == [ Expression([Symbol("hy._Fraction"), Integer(12), Integer(34)]) ]) assert tokenize("1,0_00j") == [Complex(1000j)] assert tokenize("1,,,,___,____,,__,,2__,,,__") == [Integer(12)] assert (tokenize("_1,,,,___,____,,__,,2__,,,__") == [ Symbol("_1,,,,___,____,,__,,2__,,,__") ]) assert (tokenize("1,,,,___,____,,__,,2__,q,__") == [ Symbol("1,,,,___,____,,__,,2__,q,__") ])
def test_lex_expression_float(): """ Make sure expressions can produce floats """ objs = tokenize("(foo 2.)") assert objs == [Expression([Symbol("foo"), Float(2.)])] objs = tokenize("(foo -0.5)") assert objs == [Expression([Symbol("foo"), Float(-0.5)])] objs = tokenize("(foo 1.e7)") assert objs == [Expression([Symbol("foo"), Float(1.e7)])]
def test_lex_nan_and_inf(): assert isnan(tokenize("NaN")[0]) assert tokenize("Nan") == [Symbol("Nan")] assert tokenize("nan") == [Symbol("nan")] assert tokenize("NAN") == [Symbol("NAN")] assert tokenize("Inf") == [Float(float("inf"))] assert tokenize("inf") == [Symbol("inf")] assert tokenize("INF") == [Symbol("INF")] assert tokenize("-Inf") == [Float(float("-inf"))] assert tokenize("-inf") == [Symbol("-inf")] assert tokenize("-INF") == [Symbol("-INF")]
def symbol_like(obj): "Try to interpret `obj` as a number or keyword." try: return Integer(obj) except ValueError: pass if '/' in obj: try: lhs, rhs = obj.split('/') return Expression( [Symbol('hy._Fraction'), Integer(lhs), Integer(rhs)]) except ValueError: pass try: return Float(obj) except ValueError: pass if obj not in ('j', 'J'): try: return Complex(obj) except ValueError: pass if obj.startswith(":") and "." not in obj: return Keyword(obj[1:])
def test_macroexpand_nan(): # https://github.com/hylang/hy/issues/1574 import math NaN = float('nan') x = macroexpand(Float(NaN), __name__, HyASTCompiler(__name__)) assert type(x) is Float assert math.isnan(x)
def symbol_like(obj): "Try to interpret `obj` as a number or keyword." try: return Integer(obj) except ValueError: pass if "/" in obj: try: lhs, rhs = obj.split("/") return Expression( [sym("hy._Fraction"), Integer(lhs), Integer(rhs)]) except ValueError: pass try: return Float(obj) except ValueError: pass if obj not in ("j", "J"): try: return Complex(obj) except ValueError: pass if obj.startswith(":") and "." not in obj: return Keyword(obj[1:], from_parser=True)
def test_number_model_copy(): i = Integer(42) assert (i == copy.copy(i)) assert (i == copy.deepcopy(i)) f = Float(42.) assert (f == copy.copy(f)) assert (f == copy.deepcopy(f)) c = Complex(42j) assert (c == copy.copy(c)) assert (c == copy.deepcopy(c))
def test_number_model_copy(): i = Integer(42) assert i == copy.copy(i) assert i == copy.deepcopy(i) f = Float(42.0) assert f == copy.copy(f) assert f == copy.deepcopy(f) c = Complex(42j) assert c == copy.copy(c) assert c == copy.deepcopy(c)
def test_lex_big_float(): # https://github.com/hylang/hy/issues/1448 assert tokenize("1e900") == [Float(1e900)] assert tokenize("1e900-1e900j") == [Complex(1e900, -1e900)]