ref: 0f3db39e37962190a1ab913039c344ae40bd1713
dir: /HelloWorld/README.md/
# Hello World This program prints the classic hello world message. ## Source ### hello.b:1 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. ### hello.b:3,4 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.b:6,8 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. ### hello.b:10 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. ### hello.b:11 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`. ### hello.b:13 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). ### hello.b:14 exit; The `exit` keyword terminates a thread and frees any resources belonging exclusively to it. ## Demo ; limbo hello.b ; hello Hello World! ☺ ; ## Exercises - Try removing the arguments to `init()`, what happens?