Add support for forward references to top-level variables by implicitly declaring unresolved capitalized names as globals during compilation. If a real definition is not found later, a compile-time error is raised. This enables mutual recursion at the top level and fixes issues #101 and #106. Introduce an `UNDEFINED` singleton value to mark implicitly declared globals that have not yet been explicitly defined. Update `wrenDeclareGlobal` to add such entries, and modify `wrenDefineGlobal` to check for and replace undefined placeholders. Adjust the symbol table API to allow duplicate additions for implicit declarations. Add test cases for mutual recursion, forward references in functions and methods, and undefined variable errors.
Wren is a small, fast, class-based concurrent scripting language
Think Smalltalk in a Lua-sized package with a dash of Erlang and wrapped up in a familiar, modern syntax.
IO.print("Hello, world!")
class Wren {
flyTo(city) {
IO.print("Flying to ", city)
}
}
var adjectives = new Fiber {
["small", "clean", "fast"].map {|word| Fiber.yield(word) }
}
while (!adjectives.isDone) IO.print(adjectives.call)
-
Wren is small. The codebase is about 5,000 lines. You can skim the whole thing in an afternoon. It's small, but not dense. It is readable and lovingly-commented.
-
Wren is fast. A fast single-pass compiler to tight bytecode, and a compact object representation help Wren compete with other dynamic languages.
-
Wren is class-based. There are lots of scripting languages out there, but many have unusual or non-existent object models. Wren places classes front and center.
-
Wren is concurrent. Lightweight fibers are core to the execution model and let you organize your program into an army of communicating coroutines.
-
Wren is a scripting language. Wren is intended for embedding in applications. It has no dependencies, a small standard library, and an easy-to-use C API. It's written in warning-free standard C99.
If you like the sound of this, give it a try! Even better, you can contribute to Wren itself.