Refactor the C API for invoking Wren methods from C code. Remove the old wrenGetMethod and wrenCallVarArgs functions that used a type-string-based argument marshalling system. Introduce a new slot-based approach where callers first call wrenEnsureSlots to reserve space, then use wrenSetSlot___ functions to place the receiver and arguments on the stack, and finally call wrenCall with a handle created by wrenMakeCallHandle. Results are retrieved via wrenGetSlot___. This change simplifies the VM internals, eliminates varargs parsing overhead, and yields a 185% speed improvement in the call benchmark. Update all internal modules (scheduler, io, timer) and test files to use the new API. Also fix fiber suspension to clear the API stack pointer and adjust the interpreter to store the final fiber result at stack[0] for C API access.
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.
System.print("Hello, world!")
class Wren {
flyTo(city) {
System.print("Flying to %(city)")
}
}
var adjectives = Fiber.new {
["small", "clean", "fast"].each {|word| Fiber.yield(word) }
}
while (!adjectives.isDone) System.print(adjectives.call())
-
Wren is small. The VM implementation is under 4,000 semicolons. 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 compiles cleanly as C99, C++98 or anything later.
If you like the sound of this, let's get started. You can even try it in your browser! Excited? Well, come on and get involved!