Fixed Markdown linter warnings, converted tabs to spaces and added a note on 'select' optimization

This commit is contained in:
Vyacheslav Egorov 2022-03-01 20:47:17 +02:00
parent fd2543a9a5
commit 2596fd12be

View file

@ -14,6 +14,7 @@ We have introduced a syntax to provide default type values inside the type alias
It is now possible to have type functions where the instantiation can omit some of the parameters. It is now possible to have type functions where the instantiation can omit some of the parameters.
You can provide concrete types: You can provide concrete types:
```lua ```lua
--!strict --!strict
type FieldResolver<T, Data = {[string]: any}> = (T, Data) -> number type FieldResolver<T, Data = {[string]: any}> = (T, Data) -> number
@ -23,6 +24,7 @@ local b: FieldResolver<number, {name: string}> = ...
``` ```
Or reference parameters defined earlier in the list: Or reference parameters defined earlier in the list:
```lua ```lua
--!strict --!strict
type EqComp<T, U = T> = (l: T, r: U) -> boolean type EqComp<T, U = T> = (l: T, r: U) -> boolean
@ -32,6 +34,7 @@ local b: EqComp<number, string> = ... -- (l: number, r: string) -> boolean
``` ```
Type pack parameters can also have a default value: Type pack parameters can also have a default value:
```lua ```lua
--!strict --!strict
type Process<T, U... = ...string> = (T) -> U... type Process<T, U... = ...string> = (T) -> U...
@ -41,6 +44,7 @@ local b: Process<number, (boolean, string)> = ... -- (number) -> (boolean, strin
``` ```
If all type parameters have a default type value, it is now possible to reference that without providing a type parameter list: If all type parameters have a default type value, it is now possible to reference that without providing a type parameter list:
```lua ```lua
--!strict --!strict
type All<T = string, U = number> = (T) -> U type All<T = string, U = number> = (T) -> U
@ -56,6 +60,7 @@ For more details, you can read the original [RFC proposal](https://github.com/Ro
This month we had many fixes to improve our type inference and reduce false positive errors. This month we had many fixes to improve our type inference and reduce false positive errors.
if-then-else expression can now have different types in each branch: if-then-else expression can now have different types in each branch:
```lua ```lua
--!strict --!strict
local a = if x then 5 else nil -- 'a' will have type 'number?' local a = if x then 5 else nil -- 'a' will have type 'number?'
@ -63,6 +68,7 @@ local b = if x then 1 else '2' -- 'b' will have type 'number | string'
``` ```
And if the expected result type is known, you will not get an error in cases like these: And if the expected result type is known, you will not get an error in cases like these:
```lua ```lua
--!strict --!strict
type T = {number | string} type T = {number | string}
@ -73,28 +79,32 @@ local c: T = if x then {1, "x", 2, "y"} else {0}
--- ---
`assert` result is now known to not be 'falsy' (`false` or `nil`): `assert` result is now known to not be 'falsy' (`false` or `nil`):
```lua ```lua
--!strict --!strict
local function f(x: number?): number local function f(x: number?): number
return assert(x) -- no longer an error return assert(x) -- no longer an error
end end
``` ```
--- ---
We fixed cases where length operator `#` reported an error when used on a compatible type: We fixed cases where length operator `#` reported an error when used on a compatible type:
```lua ```lua
--!strict --!strict
local union: {number} | {string} local union: {number} | {string}
local a = #union -- no longer an error local a = #union -- no longer an error
``` ```
--- ---
Functions with different variadic argument/return types are no longer compatible: Functions with different variadic argument/return types are no longer compatible:
```lua ```lua
--!strict --!strict
local function f(): (number, ...string) local function f(): (number, ...string)
return 2, "a", "b" return 2, "a", "b"
end end
local g: () -> (number, ...boolean) = f -- error local g: () -> (number, ...boolean) = f -- error
@ -112,17 +122,19 @@ We have also fixed:
## Linter improvements ## Linter improvements
A new static analysis warning was introduced to mark incorrect use of a '`a and b or c`' pattern. When 'b' is 'falsy' (`false` or `nil`), result will always be 'c', even if the expression 'a' was true: A new static analysis warning was introduced to mark incorrect use of a '`a and b or c`' pattern. When 'b' is 'falsy' (`false` or `nil`), result will always be 'c', even if the expression 'a' was true:
```lua ```lua
local function f(x: number) local function f(x: number)
-- The and-or expression always evaluates to the second alternative because the first alternative is false; consider using if-then-else expression instead -- The and-or expression always evaluates to the second alternative because the first alternative is false; consider using if-then-else expression instead
return x < 0.5 and false or 42 return x < 0.5 and false or 42
end end
``` ```
Like we say in the warning, new if-then-else expression doesn't have this pitfall: Like we say in the warning, new if-then-else expression doesn't have this pitfall:
```lua ```lua
local function g(x: number) local function g(x: number)
return if x < 0.5 then false else 42 return if x < 0.5 then false else 42
end end
``` ```
@ -131,6 +143,9 @@ end
For performance, we have changed how our Garbage Collector collects unreachable memory. For performance, we have changed how our Garbage Collector collects unreachable memory.
This rework makes it possible to free memory 2.5x faster and also comes with a small change to how we store Luau objects in memory. For example, each table now uses 16 fewer bytes on 64-bit platforms. This rework makes it possible to free memory 2.5x faster and also comes with a small change to how we store Luau objects in memory. For example, each table now uses 16 fewer bytes on 64-bit platforms.
Another optimization was made for `select(_, ...)` call.
It is now using a special fast path that has constant-time complexity in number of arguments (~3x faster with 10 arguments).
## Thanks ## Thanks
A special thanks to all the fine folks who contributed PRs this month! A special thanks to all the fine folks who contributed PRs this month!