Skip to content

Releases: jac3km4/redscript

v1.0.0-preview.22

07 Sep 19:36
Compare
Choose a tag to compare
v1.0.0-preview.22 Pre-release
Pre-release
chore: Release redscript-ast version 1.0.0-preview.22

v1.0.0-preview.21

31 Aug 10:51
Compare
Choose a tag to compare
v1.0.0-preview.21 Pre-release
Pre-release
chore: Release redscript-ast version 1.0.0-preview.21

v1.0.0-preview.20

31 Aug 01:54
Compare
Choose a tag to compare
v1.0.0-preview.20 Pre-release
Pre-release
chore: Release redscript-ast version 1.0.0-preview.20

v1.0.0-preview.19

28 Aug 21:51
Compare
Choose a tag to compare
v1.0.0-preview.19 Pre-release
Pre-release

This is a preview compiler release. DO NOT USE IT UNLESS YOU'RE A DEVELOPER. For standard releases go here.

REDscript 1 is a rewrite of REDscript that introduces a lot of improvements and new very powerful features.

Major highlights

Generics

User-defined generics with constraints and variance annotations are now supported. The compiler verifies and enforces correctness of their variance and constraints.

func TakeObject<A extends GameObject>(obj: A) -> A ...
// makes A contravariant
abstract class Predicate<-A> {
  func Test(obj: A) -> Bool
}

Lambdas

First-class anonymous functions that close over their environment are now supported.

func Demo(arg: Int32) {
  let array = [1, 2, 3, 4, 5];
  let result = FilterArray(array, (x) -> x % arg == 0);
}

func FilterArray<A>(arr: [A], filter: (A) -> Bool) -> [A] ...

Pattern matching

Powerful pattern matching for switch and if let statements is now supported.

// matching based on a subtype
switch inst {
  case let SubclassA { fieldA }:
    return fieldA;
  case let SubclassB { fieldB }:
    return fieldB[0];
}
// consuming an array
while let [.., last] = array {
  ArrayPop(array);
}
// safe downcasting
if let myClassInst as MyClass = inst {
}

Hindley-Milner-based type inference

REDscript now uses a powerful type inference algorithm that enables type safety with few to no type annotations.

class Animal {}

class Pet extends Animal {}

class Human extends Animal {}

func Demo1() -> array<Animal> {
  let array; // no type annotation needed

  ArrayPush(array, new Pet()); // compiler infers that elements of `array` are at least Pet
  ArrayPush(array, new Human()); // compiler adjusts array to the least upper type, Animal
  return array;
}

func Demo2() {
  let swap = (f, a, b) -> f(b, a);
  swap((a, b) -> RandRange(0, 1) == 0 ? a : b, 1, 2);
}

Implicit ref

The compiler now inserts the ref type automatically when needed.

class Class {}

// parameter and return type are `ref<Class>`
func Func(inst: Class) -> Class {...}

New diagnostics

The compiler now supports some additional diagnostics.

abstract class Abstract<A> {
  func Unimplemented() -> A;
}

class Concrete extends Abstract<Int32> {
}
[ERROR] scripts\Test.reds:50:7
class Concrete extends Abstract<Int32> {
      ^^^^^^^^^^
this class is missing some required method implementation(s):
  func Unimplemented() -> Int32 {}

@deriveNew annotation

A new annotation was added for automatically generating a static method that can construct an instance of the annotated class.

@deriveNew()
class Pair {
  let first: String;
  let second: Int32;
}

func Func() {
  let _ = Pair.New("a", 1);
}

Improved parser with error recovery

The parser was rewritten with better diagnostics and error recovery in mind. The compiler now reports static analysis errors even when the syntax in the file is broken.

[ERROR] At scripts\Test.reds:50:3
  let str: Int32 = "";
  ^
expected ';' after expression in statement

[ERROR] At scripts\Test.reds:50:20
  let str: Int32 = "";
                   ^^
type mismatch: found String when expected Int32

Improved I/O performance

The compiler reads and writes large binary files whenever it runs, which was one of the main bottlenecks in the past. The I/O code has been rewritten to avoid copying data and a typical full compiler run is now 2-5 times faster.

v0.5.31

28 Aug 20:47
Compare
Choose a tag to compare

[0.5.31] - 2025-08-28

Features

  • Implements struct constructor syntax for forward compatibility

Contributors

  • jekky

v1.0.0-preview.18

27 Aug 00:24
Compare
Choose a tag to compare
v1.0.0-preview.18 Pre-release
Pre-release

This is a preview compiler release. DO NOT USE IT UNLESS YOU'RE A DEVELOPER. For standard releases go here.

REDscript 1 is a rewrite of REDscript that introduces a lot of improvements and new very powerful features.

Major highlights

Generics

User-defined generics with constraints and variance annotations are now supported. The compiler verifies and enforces correctness of their variance and constraints.

func TakeObject<A extends GameObject>(obj: A) -> A ...
// makes A contravariant
abstract class Predicate<-A> {
  func Test(obj: A) -> Bool
}

Lambdas

First-class anonymous functions that close over their environment are now supported.

func Demo(arg: Int32) {
  let array = [1, 2, 3, 4, 5];
  let result = FilterArray(array, (x) -> x % arg == 0);
}

func FilterArray<A>(arr: [A], filter: (A) -> Bool) -> [A] ...

Pattern matching

Powerful pattern matching for switch and if let statements is now supported.

// matching based on a subtype
switch inst {
  case let SubclassA { fieldA }:
    return fieldA;
  case let SubclassB { fieldB }:
    return fieldB[0];
}
// consuming an array
while let [.., last] = array {
  ArrayPop(array);
}
// safe downcasting
if let myClassInst as MyClass = inst {
}

Hindley-Milner-based type inference

REDscript now uses a powerful type inference algorithm that enables type safety with few to no type annotations.

class Animal {}

class Pet extends Animal {}

class Human extends Animal {}

func Demo1() -> array<Animal> {
  let array; // no type annotation needed

  ArrayPush(array, new Pet()); // compiler infers that elements of `array` are at least Pet
  ArrayPush(array, new Human()); // compiler adjusts array to the least upper type, Animal
  return array;
}

func Demo2() {
  let swap = (f, a, b) -> f(b, a);
  swap((a, b) -> RandRange(0, 1) == 0 ? a : b, 1, 2);
}

Implicit ref

The compiler now inserts the ref type automatically when needed.

class Class {}

// parameter and return type are `ref<Class>`
func Func(inst: Class) -> Class {...}

New diagnostics

The compiler now supports some additional diagnostics.

abstract class Abstract<A> {
  func Unimplemented() -> A;
}

class Concrete extends Abstract<Int32> {
}
[ERROR] scripts\Test.reds:50:7
class Concrete extends Abstract<Int32> {
      ^^^^^^^^^^
this class is missing some required method implementation(s):
  func Unimplemented() -> Int32 {}

@deriveNew annotation

A new annotation was added for automatically generating a static method that can construct an instance of the annotated class.

@deriveNew()
class Pair {
  let first: String;
  let second: Int32;
}

func Func() {
  let _ = Pair.New("a", 1);
}

Improved parser with error recovery

The parser was rewritten with better diagnostics and error recovery in mind. The compiler now reports static analysis errors even when the syntax in the file is broken.

[ERROR] At scripts\Test.reds:50:3
  let str: Int32 = "";
  ^
expected ';' after expression in statement

[ERROR] At scripts\Test.reds:50:20
  let str: Int32 = "";
                   ^^
type mismatch: found String when expected Int32

Improved I/O performance

The compiler reads and writes large binary files whenever it runs, which was one of the main bottlenecks in the past. The I/O code has been rewritten to avoid copying data and a typical full compiler run is now 2-5 times faster.

v1.0.0-preview.17

21 Aug 23:26
Compare
Choose a tag to compare
v1.0.0-preview.17 Pre-release
Pre-release

This is a preview compiler release. DO NOT USE IT UNLESS YOU'RE A DEVELOPER. For standard releases go here.

REDscript 1 is a rewrite of REDscript that introduces a lot of improvements and new very powerful features.

Major highlights

Generics

User-defined generics with constraints and variance annotations are now supported. The compiler verifies and enforces correctness of their variance and constraints.

func TakeObject<A extends GameObject>(obj: A) -> A ...
// makes A contravariant
abstract class Predicate<-A> {
  func Test(obj: A) -> Bool
}

Lambdas

First-class anonymous functions that close over their environment are now supported.

func Demo(arg: Int32) {
  let array = [1, 2, 3, 4, 5];
  let result = FilterArray(array, (x) -> x % arg == 0);
}

func FilterArray<A>(arr: [A], filter: (A) -> Bool) -> [A] ...

Pattern matching

Powerful pattern matching for switch and if let statements is now supported.

// matching based on a subtype
switch inst {
  case let SubclassA { fieldA }:
    return fieldA;
  case let SubclassB { fieldB }:
    return fieldB[0];
}
// consuming an array
while let [.., last] = array {
  ArrayPop(array);
}
// safe downcasting
if let myClassInst as MyClass = inst {
}

Hindley-Milner-based type inference

REDscript now uses a powerful type inference algorithm that enables type safety with few to no type annotations.

class Animal {}

class Pet extends Animal {}

class Human extends Animal {}

func Demo1() -> array<Animal> {
  let array; // no type annotation needed

  ArrayPush(array, new Pet()); // compiler infers that elements of `array` are at least Pet
  ArrayPush(array, new Human()); // compiler adjusts array to the least upper type, Animal
  return array;
}

func Demo2() {
  let swap = (f, a, b) -> f(b, a);
  swap((a, b) -> RandRange(0, 1) == 0 ? a : b, 1, 2);
}

Implicit ref

The compiler now inserts the ref type automatically when needed.

class Class {}

// parameter and return type are `ref<Class>`
func Func(inst: Class) -> Class {...}

New diagnostics

The compiler now supports some additional diagnostics.

abstract class Abstract<A> {
  func Unimplemented() -> A;
}

class Concrete extends Abstract<Int32> {
}
[ERROR] scripts\Test.reds:50:7
class Concrete extends Abstract<Int32> {
      ^^^^^^^^^^
this class is missing some required method implementation(s):
  func Unimplemented() -> Int32 {}

@deriveNew annotation

A new annotation was added for automatically generating a static method that can construct an instance of the annotated class.

@deriveNew()
class Pair {
  let first: String;
  let second: Int32;
}

func Func() {
  let _ = Pair.New("a", 1);
}

Improved parser with error recovery

The parser was rewritten with better diagnostics and error recovery in mind. The compiler now reports static analysis errors even when the syntax in the file is broken.

[ERROR] At scripts\Test.reds:50:3
  let str: Int32 = "";
  ^
expected ';' after expression in statement

[ERROR] At scripts\Test.reds:50:20
  let str: Int32 = "";
                   ^^
type mismatch: found String when expected Int32

Improved I/O performance

The compiler reads and writes large binary files whenever it runs, which was one of the main bottlenecks in the past. The I/O code has been rewritten to avoid copying data and a typical full compiler run is now 2-5 times faster.

v1.0.0-preview.16

18 Aug 02:01
Compare
Choose a tag to compare
v1.0.0-preview.16 Pre-release
Pre-release

This is a preview compiler release. DO NOT USE IT UNLESS YOU'RE A DEVELOPER. For standard releases go here.

REDscript 1 is a rewrite of REDscript that introduces a lot of improvements and new very powerful features.

Major highlights

Generics

User-defined generics with constraints and variance annotations are now supported. The compiler verifies and enforces correctness of their variance and constraints.

func TakeObject<A extends GameObject>(obj: A) -> A ...
// makes A contravariant
abstract class Predicate<-A> {
  func Test(obj: A) -> Bool
}

Lambdas

First-class anonymous functions that close over their environment are now supported.

func Demo(arg: Int32) {
  let array = [1, 2, 3, 4, 5];
  let result = FilterArray(array, (x) -> x % arg == 0);
}

func FilterArray<A>(arr: [A], filter: (A) -> Bool) -> [A] ...

Pattern matching

Powerful pattern matching for switch and if let statements is now supported.

// matching based on a subtype
switch inst {
  case let SubclassA { fieldA }:
    return fieldA;
  case let SubclassB { fieldB }:
    return fieldB[0];
}
// consuming an array
while let [.., last] = array {
  ArrayPop(array);
}
// safe downcasting
if let myClassInst as MyClass = inst {
}

Hindley-Milner-based type inference

REDscript now uses a powerful type inference algorithm that enables type safety with few to no type annotations.

class Animal {}

class Pet extends Animal {}

class Human extends Animal {}

func Demo1() -> array<Animal> {
  let array; // no type annotation needed

  ArrayPush(array, new Pet()); // compiler infers that elements of `array` are at least Pet
  ArrayPush(array, new Human()); // compiler adjusts array to the least upper type, Animal
  return array;
}

func Demo2() {
  let swap = (f, a, b) -> f(b, a);
  swap((a, b) -> RandRange(0, 1) == 0 ? a : b, 1, 2);
}

Implicit ref

The compiler now inserts the ref type automatically when needed.

class Class {}

// parameter and return type are `ref<Class>`
func Func(inst: Class) -> Class {...}

New diagnostics

The compiler now supports some additional diagnostics.

abstract class Abstract<A> {
  func Unimplemented() -> A;
}

class Concrete extends Abstract<Int32> {
}
[ERROR] scripts\Test.reds:50:7
class Concrete extends Abstract<Int32> {
      ^^^^^^^^^^
this class is missing some required method implementation(s):
  func Unimplemented() -> Int32 {}

@deriveNew annotation

A new annotation was added for automatically generating a static method that can construct an instance of the annotated class.

@deriveNew()
class Pair {
  let first: String;
  let second: Int32;
}

func Func() {
  let _ = Pair.New("a", 1);
}

Improved parser with error recovery

The parser was rewritten with better diagnostics and error recovery in mind. The compiler now reports static analysis errors even when the syntax in the file is broken.

[ERROR] At scripts\Test.reds:50:3
  let str: Int32 = "";
  ^
expected ';' after expression in statement

[ERROR] At scripts\Test.reds:50:20
  let str: Int32 = "";
                   ^^
type mismatch: found String when expected Int32

Improved I/O performance

The compiler reads and writes large binary files whenever it runs, which was one of the main bottlenecks in the past. The I/O code has been rewritten to avoid copying data and a typical full compiler run is now 2-5 times faster.

Caveats

This is a pre-release and it's therefore incomplete and unstable. While it can already compile and run a lot of existing code, there are currently some limitations:

  • case is now a keyword and can't be used as an identifier
  • no @replaceGlobal annotation*

Features marked with an asterisk are planned to be included in the final release.

v0.5.30

11 Aug 20:32
Compare
Choose a tag to compare

[0.5.30] - 2025-08-11

Features

  • Adds a new @mixedRef annotation for forward compatibility
  • Adds support for the new NameOf syntax, e.g. NameOf<MyClass>()

Contributors

  • jekky

v1.0.0-preview.15

03 Aug 23:23
Compare
Choose a tag to compare
v1.0.0-preview.15 Pre-release
Pre-release

This is a preview compiler release. DO NOT USE IT UNLESS YOU'RE A DEVELOPER. For standard releases go here.

REDscript 1 is a rewrite of REDscript that introduces a lot of improvements and new very powerful features.

Major highlights

Generics

User-defined generics with constraints and variance annotations are now supported. The compiler verifies and enforces correctness of their variance and constraints.

func TakeObject<A extends GameObject>(obj: A) -> A ...
// makes A contravariant
abstract class Predicate<-A> {
  func Test(obj: A) -> Bool
}

Lambdas

First-class anonymous functions that close over their environment are now supported.

func Demo(arg: Int32) {
  let array = [1, 2, 3, 4, 5];
  let result = FilterArray(array, (x) -> x % arg == 0);
}

func FilterArray<A>(arr: [A], filter: (A) -> Bool) -> [A] ...

Pattern matching

Powerful pattern matching for switch and if let statements is now supported.

// matching based on a subtype
switch inst {
  case let SubclassA { fieldA }:
    return fieldA;
  case let SubclassB { fieldB }:
    return fieldB[0];
}
// consuming an array
while let [.., last] = array {
  ArrayPop(array);
}
// safe downcasting
if let myClassInst as MyClass = inst {
}

Hindley-Milner-based type inference

REDscript now uses a powerful type inference algorithm that enables type safety with few to no type annotations.

class Animal {}

class Pet extends Animal {}

class Human extends Animal {}

func Demo1() -> array<Animal> {
  let array; // no type annotation needed

  ArrayPush(array, new Pet()); // compiler infers that elements of `array` are at least Pet
  ArrayPush(array, new Human()); // compiler adjusts array to the least upper type, Animal
  return array;
}

func Demo2() {
  let swap = (f, a, b) -> f(b, a);
  swap((a, b) -> RandRange(0, 1) == 0 ? a : b, 1, 2);
}

Implicit ref

The compiler now inserts the ref type automatically when needed.

class Class {}

// parameter and return type are `ref<Class>`
func Func(inst: Class) -> Class {...}

New diagnostics

The compiler now supports some additional diagnostics.

abstract class Abstract<A> {
  func Unimplemented() -> A;
}

class Concrete extends Abstract<Int32> {
}
[ERROR] scripts\Test.reds:50:7
class Concrete extends Abstract<Int32> {
      ^^^^^^^^^^
this class is missing some required method implementation(s):
  func Unimplemented() -> Int32 {}

@deriveNew annotation

A new annotation was added for automatically generating a static method that can construct an instance of the annotated class.

@deriveNew()
class Pair {
  let first: String;
  let second: Int32;
}

func Func() {
  let _ = Pair.New("a", 1);
}

Improved parser with error recovery

The parser was rewritten with better diagnostics and error recovery in mind. The compiler now reports static analysis errors even when the syntax in the file is broken.

[ERROR] At scripts\Test.reds:50:3
  let str: Int32 = "";
  ^
expected ';' after expression in statement

[ERROR] At scripts\Test.reds:50:20
  let str: Int32 = "";
                   ^^
type mismatch: found String when expected Int32

Improved I/O performance

The compiler reads and writes large binary files whenever it runs, which was one of the main bottlenecks in the past. The I/O code has been rewritten to avoid copying data and a typical full compiler run is now 2-5 times faster.

Caveats

This is a pre-release and it's therefore incomplete and unstable. While it can already compile and run a lot of existing code, there are currently some limitations:

  • case is now a keyword and can't be used as an identifier
  • no @replaceGlobal annotation*
  • no static receivers (the ability to call static methods with a receiver)*

Features marked with an asterisk are planned to be included in the final release.