Skip to content

Commit fade81e

Browse files
committed
improve standard library types
1 parent 85a4505 commit fade81e

File tree

5 files changed

+581
-419
lines changed

5 files changed

+581
-419
lines changed

nattlua/definitions/lua/io.nlua

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ type File = {
2626
close = function=(self)>(boolean | nil, string, number | nil),
2727
write = function=(self, ...(number | string))>(self | nil, string | nil),
2828
flush = function=(self)>(boolean | nil, string | nil),
29-
read = function <|self: File, ...: ...any|>
29+
read = function <|self: File, ...: ...$"%**[Lanl].*" | number|>
3030
return check_read_args<|...|>
3131
end,
3232
lines = function=(self)>(Function),
@@ -36,22 +36,11 @@ type File = {
3636
type io.open = function=(string, string | nil)>(nil | File)
3737
type io.popen = function=(string, string | nil)>(nil | File)
3838
type io.output = function=()>(File)
39+
type io.type = function=(File)>("file" | "closed file" | nil)
3940
type io.stdout = File
4041
type io.stdin = File
4142
type io.stderr = File
4243

43-
analyzer function io.type(obj: any)
44-
local flags = types.Union()
45-
flags:AddType(types.ConstString("file"))
46-
flags:AddType(types.ConstString("closed file"))
47-
print(("%p"):format(obj), ("%p"):format(env.typesystem.File))
48-
49-
if false and obj:IsSubsetOf(env.typesystem.File) then return flags end
50-
51-
flags:AddType(types.Nil())
52-
return flags
53-
end
54-
5544
analyzer function io.write(...: ...string)
5645
for i, v in ipairs({...}) do
5746
if not v:IsLiteral() then return end

nattlua/definitions/lua/math.nlua

Lines changed: 160 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,109 +1,189 @@
11
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,
336
}
34-
type math.huge = inf
35-
type math.pi = 3.14159265358979323864338327950288
36-
type math.maxinteger = 0x7FFFFFFFFFFFFFFF
37-
type math.mininteger = 0x8000000000000000
387
type math.type = ReturnIfNonLiteral<|analyzer function(n: number): "float" | "integer" | "nil"
398
return "float"
409
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|>
5610

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|>
5921

60-
for i = 1, select("#", ...) do
61-
local obj = select(i, ...)
22+
analyzer function math.min(...: ...number)
23+
local numbers = {}
6224

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
6733
end
34+
35+
return math.min(table.unpack(numbers))
6836
end
6937

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
7153
end
7254

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
7580

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
7892

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())
81116
else
82-
numbers[i] = obj:GetData()
117+
return math.log(x:GetData())
83118
end
84119
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
85146

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|>
87154
end
88155

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())
93163
end
164+
|>
165+
end
94166

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
97173

98-
if n and m then return math.random(n:GetData(), m:GetData()) end
174+
return types.Number()
175+
end
99176

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
101178

102-
return math.random()
103-
end
179+
if n then return math.random(n:GetData()) end
180+
181+
return math.random()
182+
end
104183

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
107186

108-
return math.randomseed(n:GetData())
187+
return math.randomseed(n:GetData())
188+
end
109189
end

nattlua/definitions/lua/os.nlua

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,38 @@
1+
local type DateStruct = {
2+
year = number,
3+
month = number,
4+
day = number,
5+
hour = number,
6+
min = number,
7+
sec = number,
8+
wday = number,
9+
yday = number,
10+
isdst = boolean,
11+
}
112
type os = {
213
execute = function=(command: string)>(boolean | nil, string, number | nil) | function=()>(boolean | nil, string, number | nil),
314
rename = function=(oldname: string, newname: string)>(boolean | nil, string, number | nil),
415
getenv = function=(varname: string)>(string | nil),
5-
difftime = function=(t2: number, t1: number)>(number),
616
exit = function=(code: boolean | number, close: boolean)>(nil) | function=(code: boolean | number)>(nil) | function=()>(nil),
717
remove = function=(filename: string)>(boolean | nil, string, number | nil),
8-
setlocale = function=(local_e: string, category: string)>(string | nil) | function=(local_e: string)>(string | nil),
9-
date = function=(format: string, time: number)>(string | Table) | function=(format: string)>(string | Table) | function=()>(string | Table),
10-
time = function=(table: Table)>(number) | function=()>(number),
11-
clock = function=()>(number),
18+
setlocale = function=(locale: string, category: string)>(string | nil) | function=(locale: string)>(string | nil),
19+
date = function=(format: "*t", time: number)>(DateStruct) | function=(format: "*t")>(DateStruct) | function=(format: string, time: number)>(string) | function=(format: string)>(string) | function=()>(string),
20+
time = function=(date_table: DateStruct)>(number) | function=()>(number),
1221
tmpname = function=()>(string),
1322
}
23+
24+
do -- Simple functions using ReturnIfNonLiteral
25+
type os.clock = ReturnIfNonLiteral<|analyzer function(): number
26+
return os.clock()
27+
end|>
28+
type os.difftime = ReturnIfNonLiteral<|
29+
analyzer function(t2: number, t1: number): number
30+
return t2:GetData() - t1:GetData()
31+
end
32+
|>
33+
type os.tmpname = ReturnIfNonLiteral<|
34+
analyzer function(): string
35+
return "/tmp/lua_" .. tostring(math.random(100000, 999999))
36+
end
37+
|>
38+
end

0 commit comments

Comments
 (0)