Storm is a programming language platform with a strong focus on extensibility. Storm itself is mostly a framework for creating languages rather than a complete compiler. The framework is designed to make easy to implement languages that can be extended with new syntax and semantics. Of course, Storm comes bundled with a few languages (mainly Basic Storm), but these are separate from the core and could be implemented as libraries in the future. Since these languages are implemented in Storm, they allow users to create their own syntax extensions as separate libraries. Furthermore, Storm allows languages to interact with each other freely and mostly seamlessly.

Aside from extensibility, Storm is implemented as an interactive compiler. This means that Storm is designed to be executed in the background while programs are being developed. As the compiler is running in the background, it is able to provide information about the program being developed to help the developer, much like an IDE. Currently, it is possible to run Storm as a language server that provides syntax highlighting for all supported languages and language extensions to an editor, such as Emacs. In the future, the language server should be able to provide more semantic information as well. More information on the language server can be found here.

The following example illustrates some of the possibilities of Storm:

use presentation;
use layout;

// Declare the presentation. Uses an extension implemented in the package 'presentation'.
presentation Simple "My presentation" {
    // Generate a random caption for the first slide.
    Str caption = "Presentation number " + rand(1, 10).toS;

    // Create a slide.
    slide title caption, "By myself" {}

    // Another one, with an animation!
    slide FadeIn => content "Hello!" {
        list [ "Welcome to " + title, "In Storm!" ] {}

void main() {;

In this example, we use a language extension that allows creating presentation slides in a declarative manner. This extension is not a part of Basic Storm, it is implemented as a language extension that is included with the use present; statement on the first line. The language extension adds a presentation-block declares functions that create presentation. This presentation is then used inside the main function to show the presentation. The example also shows that the language extension is able to execute arbitrary Storm code in most locations by creating a random caption and storing it in the variable caption, which is later used in the slide declarations.

The syntax used to define the syntax language, together with other examples illustrating the capabilities of Storm can be found on the Examples page.

Getting started

If you are interested in Storm and want to learn more, check out some of these sections:

Note that the main goal of the documentation provided here is to get you started in using the language and to give an understanding of the language. It will not discuss specific APIs or the standard library in depth. For that kind of documentation, please refer to the built-in documentation in Storm. In the Basic Storm REPL, type help <name> to access documentation for entities in the system. For example: help core:Str will tell you about the string type and its members. help core:Str:find will tell you that there are two overloads of find.

You can also access the documentation in Storm using the Emacs plugin. Run the command M-x storm-doc and enter the name of the thing you want to see documentation for. The Emacs plugin allows interactive browsing of the documentation and provides auto completion for the name entry which makes it easy to explore the contents of packages.


If you have any questions or requests regarding Storm, please contact me at