ReScript 8.3 – nowa wersja wcześniejszego BuckleScript
Sierpień rozpoczął się nową wersją BuckleScript o numerze 8.2. W międzyczasie doszło do rebrandingu zespołu – fuzji Reason oraz BuckleScript. Dlatego też w tym tygodniu ogłoszono wydanie nowej wersji wcześniejszego BuckleScript – ReScript 8.3. ReScript jest przede wszystkim językiem z optymalizującym kompilatorem. Jest on skoncentrowany na platformie JS.
Atrybuty FFI w ReScript 8.3
Nowa wersja zawiera lekkie atrybuty FFI, ale bez prefiksu bs.. Jest on opcjonalny, więc FFI będzie mniej rozwlekłe. Przykładowo, uprości się pisanie starych, zewnętrznych wersji. Wcześniej readFileAsUtf8Sync pisano w następujący sposób:
@bs.val @bs.module("fs") external readFileAsUtf8Sync: (string, @bs.as("utf8") _) => string = "readFileSync"
Teraz jest bardziej uproszczone:
@val @module("fs") external readFileAsUtf8Sync: (string, @as("utf8") _) => string = "readFileSync"
Prawie wszystkie wcześniejsze bs.xx są możliwe do uproszczenia. Wyjątkiem są dwa atrybuty: bs.splice i bs.send.pipe. Oba całkowicie wycofano. Pierwszy zastąpiono bs.variadic, natomiast drugi atrybutem bs.send. Twórcy jednak zastrzegają, że aby zapewnić zgodność z poprzednimi wersjami, wciąż można z nich korzystać.
Niestandardowe rozszerzenia plików JS
W ReScript 8.3 użytkownik ma możliwość wybrania obsługi rozszerzeń plików JS na format modułu.
"package-specs": [{ "module": "es6", "suffix": ".mjs" },{ "module": "commonjs", "suffix": ".cjs" }],
Import w obsłudze ES6
Naprawiono pojawiający się wcześniej błąd kompilowania. Teraz, korzystając z wyjścia modułu ES6, domyślne powiązania właściwie się skompilują.
Przykładowo:
@module("hello") external input: string => string = "default" let a = input("hello")
Skompiluje się w formacie ES6:
import Hello from "hello"; var a = Hello("hello");
Lepsze wnioskowanie w ReScript 8.3
W ReScript 8.3 wniesiono lepsze wnioskowanie na podstawie typu dla wzorca let {a,b,c} = Value. Mowa tu o tym, że dla takiego kodu:
module N = { type t = {x: int} } let f = (u: N.t) => { let {x} = u x + 1 } /* type error */
Pojawiał się poniższy błąd:
Error: Unbound record field x
Kompilator poznał już typ u, więc może poprawnie wyszukać etykietę x. W wersji 8.3 oryginalny styl kodu działa od razu po rozpakowaniu.
Podsumowanie
To nie wszystkie zmiany w ReScript. Oprócz powyższych zmian wprowadzono także kilka poprawek wydajności. Nowa wersja jest dostępna do testowania.