|
1 | 1 | type math = { |
2 | | - ceil = function=(x: number)>(number), |
3 | | - tan = function=(x: number)>(number), |
4 | | - log10 = function=(x: number)>(number), |
5 | | - sinh = function=(x: number)>(number), |
6 | | - ldexp = function=(m: number, e: number)>(number), |
7 | | - tointeger = function=(x: number)>(number), |
8 | | - cosh = function=(x: number)>(number), |
9 | | - min = function=(x: number, ...)>(number), |
10 | | - fmod = function=(x: number, y: number)>(number), |
11 | | - exp = function=(x: number)>(number), |
12 | | - random = function=(m: number, n: number)>(number) | function=(m: number)>(number) | function=()>(number), |
13 | | - rad = function=(x: number)>(number), |
14 | | - log = function=(x: number, base: number)>(number) | function=(x: number)>(number), |
15 | | - cos = function=(x: number)>(number), |
16 | | - randomseed = function=(x: number)>(nil), |
17 | | - floor = function=(x: number)>(number), |
18 | | - tanh = function=(x: number)>(number), |
19 | | - max = function=(x: number, ...)>(number), |
20 | | - pow = function=(x: number, y: number)>(number), |
21 | | - ult = function=(m: number, n: number)>(boolean), |
22 | | - acos = function=(x: number)>(number), |
23 | | - type = function=(x: number)>(string), |
24 | | - abs = function=(x: number)>(number), |
25 | | - frexp = function=(x: number)>(number, number), |
26 | | - deg = function=(x: number)>(number), |
27 | | - modf = function=(x: number)>(number, number), |
28 | | - atan2 = function=(y: number, x: number)>(number), |
29 | | - asin = function=(x: number)>(number), |
30 | | - atan = function=(x: number)>(number), |
31 | | - sqrt = function=(x: number)>(number), |
32 | | - sin = function=(x: number)>(number), |
| 2 | + huge = inf, |
| 3 | + pi = 3.14159265358979323864338327950288, |
| 4 | + maxinteger = 0x7FFFFFFFFFFFFFFF, |
| 5 | + mininteger = 0x8000000000000000, |
33 | 6 | } |
34 | | -type math.huge = inf |
35 | | -type math.pi = 3.14159265358979323864338327950288 |
36 | | -type math.maxinteger = 0x7FFFFFFFFFFFFFFF |
37 | | -type math.mininteger = 0x8000000000000000 |
38 | 7 | type math.type = ReturnIfNonLiteral<|analyzer function(n: number): "float" | "integer" | "nil" |
39 | 8 | return "float" |
40 | 9 | end|> |
41 | | -type math.sin = ReturnIfNonLiteral<|analyzer function(n: number): number |
42 | | - return math.sin(n:GetData()) |
43 | | -end|> |
44 | | -type math.abs = ReturnIfNonLiteral<|analyzer function(n: number): number |
45 | | - return math.abs(n:GetData()) |
46 | | -end|> |
47 | | -type math.cos = ReturnIfNonLiteral<|analyzer function(n: number): number |
48 | | - return math.cos(n:GetData()) |
49 | | -end|> |
50 | | -type math.ceil = ReturnIfNonLiteral<|analyzer function(n: number): number |
51 | | - return math.ceil(n:GetData()) |
52 | | -end|> |
53 | | -type math.floor = ReturnIfNonLiteral<|analyzer function(n: number): number |
54 | | - return math.floor(n:GetData()) |
55 | | -end|> |
56 | 10 |
|
57 | | -analyzer function math.min(...: ...number) |
58 | | - local numbers = {} |
| 11 | +do -- basic arithmetic functions |
| 12 | + type math.abs = ReturnIfNonLiteral<|analyzer function(n: number): number |
| 13 | + return math.abs(n:GetData()) |
| 14 | + end|> |
| 15 | + type math.ceil = ReturnIfNonLiteral<|analyzer function(n: number): number |
| 16 | + return math.ceil(n:GetData()) |
| 17 | + end|> |
| 18 | + type math.floor = ReturnIfNonLiteral<|analyzer function(n: number): number |
| 19 | + return math.floor(n:GetData()) |
| 20 | + end|> |
59 | 21 |
|
60 | | - for i = 1, select("#", ...) do |
61 | | - local obj = select(i, ...) |
| 22 | + analyzer function math.min(...: ...number) |
| 23 | + local numbers = {} |
62 | 24 |
|
63 | | - if not obj:IsLiteral() then |
64 | | - return types.Number() |
65 | | - else |
66 | | - numbers[i] = obj:GetData() |
| 25 | + for i = 1, select("#", ...) do |
| 26 | + local obj = select(i, ...) |
| 27 | + |
| 28 | + if not obj:IsLiteral() then |
| 29 | + return types.Number() |
| 30 | + else |
| 31 | + numbers[i] = obj:GetData() |
| 32 | + end |
67 | 33 | end |
| 34 | + |
| 35 | + return math.min(table.unpack(numbers)) |
68 | 36 | end |
69 | 37 |
|
70 | | - return math.min(table.unpack(numbers)) |
| 38 | + analyzer function math.max(...: ...number) |
| 39 | + local numbers = {} |
| 40 | + |
| 41 | + for i = 1, select("#", ...) do |
| 42 | + local obj = select(i, ...) |
| 43 | + |
| 44 | + if not obj:IsLiteral() then |
| 45 | + return types.Number() |
| 46 | + else |
| 47 | + numbers[i] = obj:GetData() |
| 48 | + end |
| 49 | + end |
| 50 | + |
| 51 | + return math.max(table.unpack(numbers)) |
| 52 | + end |
71 | 53 | end |
72 | 54 |
|
73 | | -analyzer function math.max(...: ...number) |
74 | | - local numbers = {} |
| 55 | +do -- trigonometric functions |
| 56 | + type math.sin = ReturnIfNonLiteral<|analyzer function(n: number): number |
| 57 | + return math.sin(n:GetData()) |
| 58 | + end|> |
| 59 | + type math.cos = ReturnIfNonLiteral<|analyzer function(n: number): number |
| 60 | + return math.cos(n:GetData()) |
| 61 | + end|> |
| 62 | + type math.tan = ReturnIfNonLiteral<|analyzer function(n: number): number |
| 63 | + return math.tan(n:GetData()) |
| 64 | + end|> |
| 65 | + type math.acos = ReturnIfNonLiteral<|analyzer function(n: number): number |
| 66 | + return math.acos(n:GetData()) |
| 67 | + end|> |
| 68 | + type math.asin = ReturnIfNonLiteral<|analyzer function(n: number): number |
| 69 | + return math.asin(n:GetData()) |
| 70 | + end|> |
| 71 | + type math.atan = ReturnIfNonLiteral<|analyzer function(n: number): number |
| 72 | + return math.atan(n:GetData()) |
| 73 | + end|> |
| 74 | + type math.atan2 = ReturnIfNonLiteral<| |
| 75 | + analyzer function(y: number, x: number): number |
| 76 | + return math.atan2(y:GetData(), x:GetData()) |
| 77 | + end |
| 78 | + |> |
| 79 | +end |
75 | 80 |
|
76 | | - for i = 1, select("#", ...) do |
77 | | - local obj = select(i, ...) |
| 81 | +do -- hyperbolic functions |
| 82 | + type math.sinh = ReturnIfNonLiteral<|analyzer function(n: number): number |
| 83 | + return math.sinh(n:GetData()) |
| 84 | + end|> |
| 85 | + type math.cosh = ReturnIfNonLiteral<|analyzer function(n: number): number |
| 86 | + return math.cosh(n:GetData()) |
| 87 | + end|> |
| 88 | + type math.tanh = ReturnIfNonLiteral<|analyzer function(n: number): number |
| 89 | + return math.tanh(n:GetData()) |
| 90 | + end|> |
| 91 | +end |
78 | 92 |
|
79 | | - if not obj:IsLiteral() then |
80 | | - return types.Number() |
| 93 | +do -- logarithmic and exponential functions |
| 94 | + type math.log10 = ReturnIfNonLiteral<|analyzer function(n: number): number |
| 95 | + return math.log10(n:GetData()) |
| 96 | + end|> |
| 97 | + type math.exp = ReturnIfNonLiteral<|analyzer function(n: number): number |
| 98 | + return math.exp(n:GetData()) |
| 99 | + end|> |
| 100 | + type math.sqrt = ReturnIfNonLiteral<|analyzer function(n: number): number |
| 101 | + return math.sqrt(n:GetData()) |
| 102 | + end|> |
| 103 | + type math.pow = ReturnIfNonLiteral<| |
| 104 | + analyzer function(x: number, y: number): number |
| 105 | + return math.pow(x:GetData(), y:GetData()) |
| 106 | + end |
| 107 | + |> |
| 108 | + |
| 109 | + analyzer function math.log(x: number, base: nil | number) |
| 110 | + if not x:IsLiteral() then return types.Number() end |
| 111 | + |
| 112 | + if base then |
| 113 | + if not base:IsLiteral() then return types.Number() end |
| 114 | + |
| 115 | + return math.log(x:GetData(), base:GetData()) |
81 | 116 | else |
82 | | - numbers[i] = obj:GetData() |
| 117 | + return math.log(x:GetData()) |
83 | 118 | end |
84 | 119 | end |
| 120 | +end |
| 121 | + |
| 122 | +do -- number manipulation functions |
| 123 | + type math.fmod = ReturnIfNonLiteral<| |
| 124 | + analyzer function(x: number, y: number): number |
| 125 | + return math.fmod(x:GetData(), y:GetData()) |
| 126 | + end |
| 127 | + |> |
| 128 | + type math.ldexp = ReturnIfNonLiteral<| |
| 129 | + analyzer function(m: number, e: number): number |
| 130 | + return math.ldexp(m:GetData(), e:GetData()) |
| 131 | + end |
| 132 | + |> |
| 133 | + type math.frexp = ReturnIfNonLiteral<| |
| 134 | + analyzer function(x: number): number,number |
| 135 | + local m, e = math.frexp(x:GetData()) |
| 136 | + return m, e |
| 137 | + end |
| 138 | + |> |
| 139 | + type math.modf = ReturnIfNonLiteral<| |
| 140 | + analyzer function(x: number): number,number |
| 141 | + local i, f = math.modf(x:GetData()) |
| 142 | + return i, f |
| 143 | + end |
| 144 | + |> |
| 145 | +end |
85 | 146 |
|
86 | | - return math.max(table.unpack(numbers)) |
| 147 | +do -- angle conversion functions |
| 148 | + type math.deg = ReturnIfNonLiteral<|analyzer function(x: number): number |
| 149 | + return math.deg(x:GetData()) |
| 150 | + end|> |
| 151 | + type math.rad = ReturnIfNonLiteral<|analyzer function(x: number): number |
| 152 | + return math.rad(x:GetData()) |
| 153 | + end|> |
87 | 154 | end |
88 | 155 |
|
89 | | -analyzer function math.random(n: nil | number, m: nil | number) |
90 | | - if not analyzer.enable_random_functions then |
91 | | - if n and n:IsLiteral() and m and m:IsLiteral() then |
92 | | - return types.LNumberRange(n:GetData(), m:GetData()) |
| 156 | +do -- integer functions |
| 157 | + type math.tointeger = ReturnIfNonLiteral<|analyzer function(x: number): number |
| 158 | + return math.tointeger(x:GetData()) |
| 159 | + end|> |
| 160 | + type math.ult = ReturnIfNonLiteral<| |
| 161 | + analyzer function(m: number, n: number): boolean |
| 162 | + return math.ult(m:GetData(), n:GetData()) |
93 | 163 | end |
| 164 | + |> |
| 165 | +end |
94 | 166 |
|
95 | | - return types.Number() |
96 | | - end |
| 167 | +do -- random functions |
| 168 | + analyzer function math.random(n: nil | number, m: nil | number) |
| 169 | + if not analyzer.enable_random_functions then |
| 170 | + if n and n:IsLiteral() and m and m:IsLiteral() then |
| 171 | + return types.LNumberRange(n:GetData(), m:GetData()) |
| 172 | + end |
97 | 173 |
|
98 | | - if n and m then return math.random(n:GetData(), m:GetData()) end |
| 174 | + return types.Number() |
| 175 | + end |
99 | 176 |
|
100 | | - if n then return math.random(n and n:GetData()) end |
| 177 | + if n and m then return math.random(n:GetData(), m:GetData()) end |
101 | 178 |
|
102 | | - return math.random() |
103 | | -end |
| 179 | + if n then return math.random(n:GetData()) end |
| 180 | + |
| 181 | + return math.random() |
| 182 | + end |
104 | 183 |
|
105 | | -analyzer function math.randomseed(n: number) |
106 | | - if not analyzer.enable_random_functions then return end |
| 184 | + analyzer function math.randomseed(n: number) |
| 185 | + if not analyzer.enable_random_functions then return end |
107 | 186 |
|
108 | | - return math.randomseed(n:GetData()) |
| 187 | + return math.randomseed(n:GetData()) |
| 188 | + end |
109 | 189 | end |
0 commit comments