:: {g:g, o:o, s:s, b:b, qb:b?, n:n, qn:n?, r8:r8, qr8:r8?, r4:r4, qr4:r4?, i:i, qi:i?, i8:i8, qi8:i8?, i4:i4, qi4:i4?, i2:i2, qi2:i2?, i1:i1, qi1:i1?, u8:u8, qu8:u8?, u4:u4, qu4:u4?, u2:u2, qu2:u2?, u1:u1, qu1:u1?}

// *** Power and unary operators on literals.
2^3
3^2
2d^3
3^2d
null^3
2^null
null^null

16^0
16i8^0
16u8^0
16^0r
16r^0
16ia^0

16^-1
16i8^-1
16u8^-1
16^-1r
16r^-1
16ia^-1

2^(-2)
2^-2
2d^(-2)
2^-2d
-2^4
(-2)^4
(-2f)^4
2^-null
null^-2

2^3^2
2^(3^2)
(2^3)^2

3^2^3^2 // overflow
3^(2^(3^2)) // overflow
3^2^3^2d // humongous
3^(2^(3^2d)) // humongous
((3^2)^3)^2
((3d^2)^3)^2

4^3^2
4^(3^2)
(4^3)^2

5^4^3^2 // overflow
5^(4^(3^2)) // overflow
5^4^3^2d // infinite
5^(4^(3^2d)) // infinite
((5^4)^3)^2
((5d^4)^3)^2 // fp result has too many bits of precision for double, so won't show the same answer as the previous line.

5^-4^3^2 // one
5^(-4^(3^2)) // one
5^-4^3^2d // zero
5^(-4^(3^2d)) // zero
((5^-4)^3)^2
((5d^-4)^3)^2

2^3%
(2^3)%
2^(3%)

2%^3%
2%^3%^4%
2%^3%^4%^5%
2%^(3%)
2%^(3%)^(4%)
2%^(3%)^(4%)^(5%)

2u8^5

// *** Power and unary operators on names.

r4^1
r4^(10f / 10)
r4^-(10f / -10)
r4^(10 / 10)
r4^-(10 / -10)

r8^1
r8^(10 / 10)
r8^-(10 / -10)

r8^(2 + 3)
(2 + 3)^r8

2^g
2^o
2^s
2^b
2^n
2^r8
2^r4
2^i
2^i8
2^i4
2^i2
2^i1
2^u8
2^u4
2^u2
2^u1

2^-g
2^-o
2^-s
2^-b
2^-n
2^-r8
2^-r4
2^-i
2^-i8
2^-i4
2^-i2
2^-i1
2^-u8
2^-u4
2^-u2
2^-u1

(-2)^g
(-2)^o
(-2)^s
(-2)^b
(-2)^n
(-2)^r8
(-2)^r4
(-2)^i
(-2)^i8
(-2)^i4
(-2)^i2
(-2)^i1
(-2)^u8
(-2)^u4
(-2)^u2
(-2)^u1

2u^g
2u^o
2u^s
2u^b
2u^n
2u^r8
2u^r4
2u^i
2u^i8
2u^i4
2u^i2
2u^i1
2u^u8
2u^u4
2u^u2
2u^u1

2u8^g
2u8^o
2u8^s
2u8^b
2u8^n
2u8^r8
2u8^r4
2u8^i
2u8^i8
2u8^i4
2u8^i2
2u8^i1
2u8^u8
2u8^u4
2u8^u2
2u8^u1

2f^g
2f^o
2f^s
2f^b
2f^n
2f^r8
2f^r4
2f^i
2f^i8
2f^i4
2f^i2
2f^i1
2f^u8
2f^u4
2f^u2
2f^u1

null^g
null^o
null^s
null^b
null^n
null^r8
null^r4
null^i
null^i8
null^i4
null^i2
null^i1
null^u8
null^u4
null^u2
null^u1

2^qb
2^qn
2^qr8
2^qr4
2^qi
2^qi8
2^qi4
2^qi2
2^qi1
2^qu8
2^qu4
2^qu2
2^qu1

2^-qb
2^-qn
2^-qr8
2^-qr4
2^-qi
2^-qi8
2^-qi4
2^-qi2
2^-qi1
2^-qu8
2^-qu4
2^-qu2
2^-qu1

(-2)^qb
(-2)^qn
(-2)^qr8
(-2)^qr4
(-2)^qi
(-2)^qi8
(-2)^qi4
(-2)^qi2
(-2)^qi1
(-2)^qu8
(-2)^qu4
(-2)^qu2
(-2)^qu1

2u^qb
2u^qn
2u^qr8
2u^qr4
2u^qi
2u^qi8
2u^qi4
2u^qi2
2u^qi1
2u^qu8
2u^qu4
2u^qu2
2u^qu1

2f^qb
2f^qn
2f^qr8
2f^qr4
2f^qi
2f^qi8
2f^qi4
2f^qi2
2f^qi1
2f^qu8
2f^qu4
2f^qu2
2f^qu1

null^qb
null^qn
null^qr8
null^qr4
null^qi
null^qi8
null^qi4
null^qi2
null^qi1
null^qu8
null^qu4
null^qu2
null^qu1

g^2
o^2
s^2
b^2
n^2
r8^2
r4^2
i^2
i8^2
i4^2
i2^2
i1^2
u8^2
u4^2
u2^2
u1^2

qb^2
qn^2
qr8^2
qr4^2
qi^2
qi8^2
qi4^2
qi2^2
qi1^2
qu8^2
qu4^2
qu2^2
qu1^2

// *** Lifting
:: {g:g*, o:o*, s:s*, b:b*, qb:b?*, n:n*, qn:n?*, r8:r8*, qr8:r8?*, r4:r4*, qr4:r4?*, i:i*, qi:i?*, i8:i8*, qi8:i8?*, i4:i4*, qi4:i4?*, i2:i2*, qi2:i2?*, i1:i1*, qi1:i1?*, u8:u8*, qu8:u8?*, u4:u4*, qu4:u4?*, u2:u2*, qu2:u2?*, u1:u1*, qu1:u1?*}

2^g
2^o
2^s
2^b
2^n
2^r8
2^r4
2^i
2^i8
2^i4
2^i2
2^i1
2^u8
2^u4
2^u2
2^u1

2^qb
2^qn
2^qr8
2^qr4
2^qi
2^qi8
2^qi4
2^qi2
2^qi1
2^qu8
2^qu4
2^qu2
2^qu1

g^2
o^2
s^2
b^2
n^2
r8^2
r4^2
i^2
i8^2
i4^2
i2^2
i1^2
u8^2
u4^2
u2^2
u1^2

qb^2
qn^2
qr8^2
qr4^2
qi^2
qi8^2
qi4^2
qi2^2
qi1^2
qu8^2
qu4^2
qu2^2
qu1^2

[1,2,3]^2
Wrap([1,2,3])^2
[-1,-2,-3]^2
Test.Wrap([-1,-2,-3])^2

[[1,2,3], [-1,-2,-3], [4,5]]^2
Wrap([[1,2,3], [-1,-2,-3], [4,5]])^2
[Wrap([1,2,3]), [-1,-2,-3], [4,5]]^2
[[1,2,3], Wrap([-1,-2,-3]), [4,5]]^2
[[1,2,3], [-1,-2,-3], Wrap([4,5])]^2

2^3
[[1,2,3], [-1,-2,-3], Wrap([4,5])]^2
