• Stars
    star
    150
  • Rank 247,323 (Top 5 %)
  • Language
    Zig
  • License
    MIT License
  • Created over 5 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

LoLa is a small programming language meant to be embedded into games.

LoLa Programming Language

LoLa Logo

LoLa is a small programming language meant to be embedded into games to be programmed by the players. The compiler and runtime are implemented in Zig and C++.

Short Example

var list = [ "Hello", "World" ];
for(text in list) {
	Print(text);
}

You can find more examples in the examples folder.

Why LoLa when there is X?

LoLa isn't meant to be your next best day-to-day scripting language. Its design is focused on embedding the language in environments where the users want/need/should write some small scripts like games or scriptable applications. In most script languages, you as a script host don't have control over the execution time of the scripts you're executing. LoLa protects you against programming errors like endless loops and such:

Controlled Execution Environment

Every script invocation gets a limit of instructions it might execute. When either this limit is reached or the script yields for other reasons (asynchronous functions), the execution is returned to the host.

This means, you can execute the following script "in parallel" to your application main loop without blocking your application and without requiring complex multithreading setups:

var timer = 0;
while(true) {
	Print("Script running for ", timer, " seconds.");
	timer += 1;
	Sleep(1.0);
}

Native Asynchronous Design

LoLa features both synchronous and asynchronous host functions. Synchronous host function calls are short-lived and will be executed in-place. Asynchronous functions, in contrast, will be executed multiple times until they yield a value. When they don't yield a value, control will be returned to the script host.

This script will not exhaust the instruction limit, but will only increment the counter, then return control back to the host:

var counter = 0;
while(true) {
	counter += 1;
	Yield();
}

This behaviour can be utilized to wait for certain events in the host environment, for example to react to key presses, a script could look like this:

while(true) {
	var input = WaitForKey();
	if(input == " ") {
		Print("Space was pressed!");
	}
}

Note that the current implementation is not thread-safe, but requires to use the limited execution for running scripts in parallel.

Native "RPC" Design

LoLa also allows executing multiple scripts on the same environment, meaning that you can easily create cross-script communications:

// script a:
var buffer;
function Set(val) { buffer = val; }
function Get() { return val; }

// script b:
// GetBuffer() returns a object referencing a environment for "script a"
var buffer = GetBuffer();
buffer.Set("Hello, World!");

// script c:
// GetBuffer() returns a object referencing a environment for "script a"
var buffer = GetBuffer(); 
Print("Buffer contains: ", buffer.Get());

With a fitting network stack and library, this can even be utilized cross-computer.

This example implements a small chat client and server that could work with LoLa RPC capabilities:

// Chat client implementation:
var server = Connect("lola-rpc://random-projects.net/chat");
if(server == void) {
	Print("Could not connect to chat server!");
	Exit(1);
}

while(true) {
	var list = server.GetMessages(GetUser());
	for(msg in list) {
		Print("< ", msg);
	}
	
	Print("> ");
	var msg = ReadLine();
	if(msg == void)
		break;
	if(msg == "")
		continue;
	server.Send(GetUser(), msg);
}
// Chat server implementation
var messages = CreateDictionary();

function Send(user, msg)
{
	for(other in messages.GetKeys())
	{
		if(other != user) {
			var log = messages.Get(other);
			if(log != void) {
				log = log ++ [ user + ": " + msg ];
			} else {
				log = [];
			}
			messages.Set(other, log);
		}
	}
}

function GetMessages(user)
{
	var log = messages.Get(user);
	if(log != void) {
		messages.Set(user, []);
		return log;
	} else {
		return [];
	}
}

Serializable State

As LoLa has no reference semantics except for objects, it is easy to understand and learn. It is also simple in its implementation and does not require a complex garbage collector or advanced programming knowledge. Each LoLa value can be serialized/deserialized into a sequence of bytes (only exception are object handles, those require some special attention), so saving the current state of a environment/vm to disk and loading it at a later point is a first-class supported use case.

This is especially useful for games where it is favourable to save your script state into a save game as well without having any drawbacks.

Simple Error Handling

LoLa provides little to no in-language error handling, as it's not designed to be robust against user programming errors. Each error is passed to the host as a panic, so it can show the user that there was an error (like OutOfMemory or TypeMismatch).

In-language error handling is based on the dynamic typing: Functions that allow in-language error handling just return void instead of a actual return value or true/false for success or failure.

This allows simple error checking like this:

var string = ReadFile("demo.data");
if(string != void) {
	Print("File contained ", string);
}

This design decision was made with the idea in mind that most LoLa programmers won't write the next best security critical software, but just do a quick hack in game to reach their next item unlock.

Smart compiler

As LoLa isn't the most complex language, the compiler can support the programmer. Even though the language has fully dynamic typing, the compiler can do some type checking at compile time already:

// warning: Possible type mismatch detected: Expected number|string|array, found boolean
if(a < true) { }

Right now, this is only used for validating expressions, but it is planned to extend this behaviour to annotate variables as well, so even more type errors can be found during compile time.

Note that this is a fairly new feature, it does not catch all your type mismatches, but can prevent the obvious ones.

Starting Points

To get familiar with LoLa, you can check out these starting points:

When you want to contribute to the compiler, check out the following documents:

Visual Studio Code Extension

If you want syntax highlighting in VSCode, you can install the lola-vscode extension.

Right now, it's not published in the gallery, so to install the extension, you have to sideload it. See the VSCode documentation for this.

Building

Continous Integration

Build Render Website

Requirements

Building

zig build
./zig-cache/bin/lola

Examples

To compile the host examples, you can use zig build examples to build all provided examples. These will be available in ./zig-cache/bin then.

Running the test suite

When you change things in the compiler or VM implementation, run the test suite:

zig build test

This will execute all zig tests, and also runs a set of predefined tests within the src/test/ folder. These tests will verify that the compiler and language runtime behave correctly.

Building the website

The website generator is gated behind -Denable-website which removes a lot of dependencies for people not wanting to render a new version of the website. If you still want to update/change the website or documentation, use the following command:

zig build -Denable-website "-Dversion=$(git describe --tags || git rev-parse --short HEAD)" website

It will depend on koino, which is included as a git submodule. Adding new pages to the documentation is done by modifying the menu_items array in src/tools/render-md-page.zig.

More Repositories

1

kristall

Graphical small-internet client for windows, linux, MacOS X and BSDs. Supports gemini, http, https, gopher, finger.
C++
653
star
2

zig-network

A smallest-common-subset of socket functions for crossplatform networking, TCP & UDP
Zig
271
star
3

ZigAndroidTemplate

This repository contains a example on how to create a minimal Android app in Zig.
Zig
202
star
4

SDL.zig

A shallow wrapper around SDL that provides object API and error handling
C
188
star
5

VersaTile

A simple 3D model editor based on simple quads and a sprite set.
C
160
star
6

zero-graphics

Application framework based on OpenGL ES 2.0. Runs on desktop machines, Android phones and the web
Zig
124
star
7

zig-args

Simple-to-use argument parser with struct-based config
Zig
119
star
8

zig-qoi

Quite OK Image format encoder/decoder written in Zig
Zig
109
star
9

zig-opengl

OpenGL binding generator based on the opengl registry
C#
62
star
10

Ziguana-Game-System

A retro-style gaming console running on bare x86 metal written in Zig
Zig
47
star
11

parser-toolkit

A toolkit that makes it easier to write recursive-descent parsers in Zig.
Zig
45
star
12

TinyVG

A new format for vector graphics: Tiny vector graphics
Zig
36
star
13

TextEditor

A backbone for text editors. No rendering, no input, but everything else.
Zig
32
star
14

zig-serve

Server implementations for several protocols in Zig. Includes http(s), gemini and gopher
Zig
30
star
15

zig-bearssl

A BearSSL binding for Zig
Zig
27
star
16

livedecode

A super hacky tool to decode unknown binary formats
Zig
26
star
17

any-pointer

A type erasure library for Zig that is meant to be eventually upstreamed to std
Zig
25
star
18

ZTT

Precompiled Zig text template engine
Zig
20
star
19

spu-mark-ii

CPU and home computer project
VHDL
17
star
20

zig-gamedev-lib

xq's Zig Game Development Library
Zig
16
star
21

SoftRenderLib

A collection of software rendering routines
Zig
16
star
22

BrokenRemote

A remote debugging tool for The Binding of Isaac: Afterbirth+
C++
14
star
23

zig-mqtt

A build package for mqtt-c.
Zig
14
star
24

gurl

A curl-like cli application to interact with Gemini sites.
Zig
14
star
25

ftz

A simple cross-platform file transfer utility
Zig
14
star
26

zig-uri

A small URI parser that parses URIs after RFC3986
Zig
12
star
27

makeshift

A dead-simple programming language
Zig
11
star
28

zig-gemtext

A zig library to manipulate gemini text files
Zig
10
star
29

SDL.zig-Example

A small usage example on how to build and use SDL.zig
Zig
10
star
30

waveform

Generates nice Unicode rendered waveforms.
Zig
9
star
31

OpenWorld.Engine

A C# game engine based on OpenGL and OpenTK.
C#
9
star
32

zig-tracer

A small raytracer written in zig.
Zig
9
star
33

WaveFunctionCollapse

A just-for-fun implementation of 2D wave function collapse
Zig
9
star
34

SLF

The Simple Linking Format
Zig
8
star
35

zig-assimp

Open Asset Importer Library built with Zig
C
8
star
36

OpenCL

An open source OpenCL wrapper written in C#. Usable with all .NET versions since 2.0.
C#
7
star
37

ZigPaint

A simple paint application written in Zig. Used to create an OpenGL loader/wrapper and a minimal UI system.
Zig
7
star
38

zyclone

A game engine modelled after the Acknex A8 engine which is used for Gamestudio A8.
Zig
7
star
39

lua

Fork of Lua with support for build.zig
C
6
star
40

zig-build-chapter-2

Files for the zig build explained series
C
6
star
41

TIS-100

A real word implementation of the fantastic TIS-100 CPU by Zachtronics.
VHDL
5
star
42

Crayos

Global Game Jam 2024 Game
Go
5
star
43

acknext

A game engine prototype loosely inspired on the Acknex A8 engine.
Logos
4
star
44

SQEditor

ShadeQ Level Editor for Lite-C
C
4
star
45

turtlefont

A small vector graphics font file format with an example font.
Zig
4
star
46

cg-workbench

Live shader and graphics coding tool
C
4
star
47

zig-sg4f-playground

A playground to try out different stuff with a propietary LPC1786 hardware
Zig
4
star
48

zig-ihex

An intel hex loader written in Zig
Zig
3
star
49

ESOPUNKS

Implementation of the EXA programming language by Zachtronics
Zig
3
star
50

SmallscaleCI

A very tiny CI implementation for self-hosted runners
Shell
3
star
51

TUST

Scripting Library and Game Templates for Gamestudio A8
C
3
star
52

PandorOS

Another attempt to create a small operating system. This time, more features, less fancy code.
C
3
star
53

asciitable

A very basic tool that just prints the ascii table
Zig
3
star
54

AckNET

A .NET wrapper for the Acknex Engine.
C#
3
star
55

LoLa-csharp

Logic Language, a small embeddable scripting language meant for user-based script input in games
C#
3
star
56

ashet.computer

A self-made computer platform
Lua
2
star
57

zig-kms-dri

Experiments with KMS and DRI. Who needs X11/Wayland anyways?!
Zig
2
star
58

Retro-FPS

Oldschoolish first person shooter.
C
2
star
59

zig-ode

Zig ODE sdk
Zig
2
star
60

cbm-tools

A small collection of CBM computer related tools
Zig
2
star
61

pkg

Project and library package manager. Similar to linux package managers but for libraries and project templates.
C#
2
star
62

maps

Multiple Audio Playback Streams - A basic audio mixing library
Zig
2
star
63

psi

A work-in-progress programming language, focused on a kind of crazy, but "well" considered concept...
C#
2
star
64

trainOS

An operating system with everything built custom.
Makefile
2
star
65

WMB

Gamestudio WMB level loader in C++17
C++
2
star
66

zig-mbedtls

A mbedtls build wrapper for Zig build
C
2
star
67

I2P.Sam

C# Interface to the I2P SAM protocol.
C#
2
star
68

Uml2Cpp

Write your own classes with an easy to use modeling language and convert your code to C++. The generated source is prepared for the use with Qt and an example file explains how to use the script.
Lua
2
star
69

ShaderCore

ShaderCore is a shader library for OpenTK and OpenGL 4.0 or larger. It provides single shader files that have conditional compilation, include files, default shader and a shader class system. This provides flexible shader code with much lesser redundtant code to be written.
C#
2
star
70

weekend-raytracer

Just a tiny raytracer in several languages
C++
1
star
71

hyperdoc

A hyperlinked rich text format
Zig
1
star
72

depmake

Simple build system made for trainOS
C#
1
star
73

lola-vscode

LoLa extension for VSCode
1
star
74

SDL3-Api-Generator-Example

C
1
star
75

PeopleDoOpenGL

Made at Nordlicht 2018, teaching people OpenGL
C
1
star
76

ker

A really small C++ library that provides some basic collections and value types.
C++
1
star
77

ecp5-quickstart

A blinky template for a full ECP5 verilog workflow including simulation, synthesis and programming
Verilog
1
star
78

MidiV

A midi visualization tool
C++
1
star
79

fraxinus

Small simple terminal emulation library
Zig
1
star
80

TerraForm

A feature based terrain editor
C++
1
star
81

VoxelizedRenderer

Simple uniform grid voxel renderer with OpenCL, written in C#.
C#
1
star
82

minitest

A minimal C++ testing framework in 101 LOC
C++
1
star
83

ggj-2021

Untitled Game for Global Game Jam
Lua
1
star
84

gemini-web-bridge

Serving simple web files with support for gemini translation
Lua
1
star
85

zfx-logbot

IRC LogBot made for #zfx, #lost on irc.euirc.net
Lua
1
star
86

DasOS

DasOS is a research project which contains prototypes for different parts regarding OS development like kernels, virtual machines, file formats and systems.
C
1
star
87

bullshit-bingo

BULLSHIT!
Lua
1
star
88

avr-tutorial

Contains some basic examples on how to set up an AVR project
TeX
1
star
89

navmesh

A navmesh implementation in zig
Zig
1
star
90

CodersNotepad

Spiritual clone of ProgrammersNotepad 2 made with Qt.
C++
1
star
91

KernelTemplate

A pretty primitive kernel base with physical and virtual memory management and a console.
C
1
star
92

NextMMO

An RPGMaker styled multiplayer game focused on, well, nothing special.
JavaScript
1
star
93

BlocksWorld

BlocksWorld is an attempt to create a small game that provides a creativity environment where players can build their own (small) worlds.
C#
1
star
94

DbusAvrLink

A dbus (TI calculator protocol) implementiation for AVRs.
Assembly
1
star
95

Sharpsole

C# goes scripting! A C# console compile-and-execute tool. Compiles one or more files into a in-memory assembly and runs it immediately.
C#
1
star
96

libgamestudio

A library that decodes file formats used by the Gamestudio/Acknex engine
Zig
1
star
97

tools.mq32.de

A collection of small, web-based tools
HTML
1
star
98

Lylios

A small pathtracer, nothing special really
C++
1
star
99

link.zig-concept-art

A concept for a replacement for linker scripts
Zig
1
star
100

LOST

LOST Programming Language
1
star