Wonkey Programming Language
Wonkey is an open source programming language for the creation of cross-platform video games, highly inspired by the “Blitz” range of languages.
Wonkey on Raspbian (Raspberry PI 4)
Click screenshots to run the examples in browser:
Setup Emscripten target
See installation instructions from Emscripten site.
# Get the emsdk repo git clone https://github.com/emscripten-core/emsdk.git # Enter that directory cd emsdk # Fetch the latest version of the emsdk (not needed the first time you clone) git pull # Download and install the latest SDK tools. ./emsdk install latest # Make the "latest" SDK "active" for the current user. (writes .emscripten file) ./emsdk activate latest # Activate PATH and other environment variables in the current terminal source ./emsdk_env.sh #In the description above we asked the emsdk to install and activate latest, which is the latest tagged release. That is often what you want. # You can also install a specific version by specifying it, for example, ./emsdk install 1.38.45
NOTE: on macOS, you can use
brew install emscripten.
NOTE: on Windows, run
emsdk instead of
emsdk_env.bat instead of
Introduction to Wonkey
ℹ️ More complete help and samples are available online at https://wonkey-coders.github.io/.
Function Main() Print "Hello, Wonkey!" End
While staying true to the 'basic' style of the original Blitz languages, Wonkey offers some very powerful new features including:
Generic classes and methods
Classes, interfaces, structs, methods and functions can have 'type' parameters.
Struct Rect<T> Field x0:T, y0:T Field x1:T, y1:T End 'Main entry Function Main() Local r:=New Rect<Float> End
'First class' functions
Functions (and methods) can be stored in variables and passed to/from other functions.
Function Test1() Print "Test1" End Function Test2() Print "Test2" End Function Tester( test:Void() ) test() End 'Main entry Function Main() Tester( Test1 ) Tester( Test2 ) End
Lambda functions allow you to create closures.
Function Test( func:Void() ) func() End 'Main entry Function Main() For Local i:=0 Until 10 Test( Lambda() Print i End) Next End
New 'Struct' type that provides value semantics
Structs are similar to classes in that they encapsulate member data, but differ in that they are passed around 'by value' instead of 'by reference'.
This allows structs to be efficiently create on the stack without any garbage collection overhead.
Struct S Field data:Int=10 End Function Test( s:S ) s.data = 100 End 'Main entry Function Main() Local s:=New S 'Create a new S on the stack (very fast!) Test( s ) 'Test gets a copy of 's' Print s.data 'Print '10' End
Fibers for easy asynchronous programming
Fibers provide support for 'cooperative' multi-threading.
Function Server( host:String, service:String ) Local server:=Socket.Listen( host, service ) Repeat Local client:=server.Accept() New Fiber( Lambda() Local data:=client.Receive(...) End ) Forever End
Operator overloading allows you to override the meaning of the built-in language operators, making for more expressive code.
Struct Vec2 Field x:Float Field y:Float Method New( x:float,y:Float ) Self.x=x Self.y=y End Operator+:Vec2( v:Vec2 ) Return New Vec2( x+v.x,y+v.y ) End Operator To:String() Return "Vec2("+x+","+y+")" End End 'Main entry Function Main() Local v0:=New Vec2( 10,20 ) Local v1:=New Vec2( 30,40 ) Print v0+v1 End
Class extensions allow you to add extra methods, functions and properties to existing classes.
Struct Foo Field i:Int=0 End
Struct Foo Extension Method Increment() i+=1 End End
Fully garbage collected
Wonkey provides a 'mostly' incremental garbage collector that efficiently collects garbage as it runs without any of those annoying 'sweep' spikes found in typical garbage collectors.
Optional reflection features
Wonkey includes an optional reflection system that allows you to inspect and modify variables and values at runtime:
#Import "<reflection>" Class C Method Update( msg:String ) Print "C.Update : msg=" + msg End End 'Main entry Function Main() Local c:=New C Local type:=Typeof( c ) Print type Local decl:=type.GetDecl( "Update" ) decl.Invoke( c, "Hello World!" ) End