Foundations for the next generation of strong dynamic typing

Lever is a loosely specified general purpose programming language, and a runtime implementation of that language. Many tradeoffs have been made to obtain high plasticity worthy of pride. To make use of this every feature is tried in practice to level out prickly details in the language before a major release.

Very handsome payouts of our approach have already appeared. For example. We have tools in place to minimize the labour involved in using external C libraries from our language, to the point where none other language implementation does it. All of this has happened with handful of people, although many important ideas that make up Lever originate from external sources such as academic papers and open source communities. Lever runtime is entirely open source in order to give back to those communities as thanks for what they have brought.

In the design there's a focus to support interactive programming of multimedia programs.

Combine this with rest of the features, and you get so incredibly simple programs that do incredibly
complex things. For example, check this
implementation of Logo out.

Modules, without sys.modules

There's no global object in lever that holds all the loaded modules. Instead the loaded modules are kept in module scopes. It is first-class loaded-modules handling! You can stack module scopes over others. There's 15 lines to plugin system or live coding from here:

test = (parent):
parent.switch() # switches back
print("4 second hello!")
dat = greenlet(test)
dat.switch(getcurrent()) # goes to run test.
# now we have a greenlet that hasn't returned.
sleep(4, dat)
# that inserted it into an event loop, cool?

That's right, greenlets! This is how any event emitter works in lever. You don't need to worry whether it should be callbacks or greenlets. You can either wait for event or pass a callback and things keep working.

What if you stuck your app to wait for an event, but the event source is removed and the waiting code should release file handle? No problem. The event source schedules 'Discard' -exception thrown to the greenlet, that makes your waiting code to gracefully exit.