This program prints the classic hello world message.
implement Hello;
The implement
keyword tells us the name of the module being defined. This file is associated with the implementation of the Hello
module.
include "sys.m";
include "draw.m";
The include
keyword provides the modules which we can load and unload from. As per limbo(1), the current working directory is searched, then /modules/
, for valid module files to match the include
statements.
Hello: module {
init: fn(nil: ref Draw->Context, nil: list of string);
};
This is a module definition. Module definitions can appear in .m
module files or they can be provided in a .b
source file.
The init
line provides a definition for the name init
, in this case, it's a function definition as indicated by fn
which takes two arguments, but does not attribute variables to them due to the nil
keyword. You could think of this definition as analogous to a function prototype in C.
The ref Draw->Context
definition states that the variable is a reference to a variable of type Context
within the module Draw
.
The list of string
definition states that the variable is a list of strings.
init(nil: ref Draw->Context, nil: list of string) {
...
}
This is a function definition. The function is named init
and its arguments and return type(s) must match that of the prototype in the module definition.
sys := load Sys Sys->PATH;
This is a variable definition and initalization for the name sys
.
The :=
operator tells us that the variable's type is defined implicitly by the return value of the righthand side.
The load
keyword loads from a given module in the format load Module path
. In this case, the path is provided by the module definition. If Sys
were a module in our directory, we could load it via load Sys "./sys.dis"
. The Sys
module definition is provided inside Inferno at /module/sys.m
.
sys->print("Hello World! ☺\n");
This line calls a function named print
, from the Sys
module, which is loaded into the variable sys
. The argument provided is a unicode string. All strings in Limbo are considered to be valid unicode (utf-8).
exit;
The exit
keyword terminates a thread and frees any resources belonging exclusively to it.
; limbo hello.b
; hello
Hello World! ☺
;
- Try removing the arguments to
init()
, what happens?