Bob Nystrom 6dc4286ffa Always wrap functions in closures.
This has a couple of pros:

- It simplifies some code that used to have to check whether a called
  thing is a bare function or a closure.
- It's faster because we don't need to do the above checks every time
  something is called.
- It lets us more precisely type some fields that used to be Obj*
  because they could hold an ObjClosure* or ObjFn*.

The cost is that we allocate a closure every time a function is
declared, even if it has no upvalues. Since functions are called way
more often than they are declared, this is still a net win.

On my Mac laptop:

api_call - wren            0.06s 0.0020 104.73%
api_foreign_method - wren  0.32s 0.0040 101.89%
binary_trees - wren        0.23s 0.0057  98.82%
binary_trees_gc - wren     0.79s 0.0170  98.46%
delta_blue - wren          0.13s 0.0031 101.36%
fib - wren                 0.23s 0.0038 103.15%
fibers - wren              0.04s 0.0017  98.97%
for - wren                 0.08s 0.0017 107.81%
method_call - wren         0.12s 0.0024  98.60%
map_numeric - wren         0.31s 0.0052 103.93%
map_string - wren          0.11s 0.0113  97.97%
string_equals - wren       0.20s 0.0023 107.75%
2016-03-26 14:00:17 -07:00
2016-03-07 07:41:00 -08:00
2016-02-14 22:21:50 -08:00
2016-03-26 14:00:17 -07:00
2016-03-16 07:22:18 -07:00
2015-10-18 10:56:11 +01:00
2016-01-17 23:28:25 +05:30
2015-11-21 09:20:50 -08:00

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!

Build Status

Description
The Wren Programming Language. Wren is a small, fast, class-based concurrent scripting language.
Readme MIT 14 MiB
Languages
Wren 84.4%
C 10.7%
Makefile 1.8%
Python 1.6%
Dart 0.6%
Other 0.9%