Skip to main content

First program

Create an empty directory and save the following file as hello.wl:

hello.wl
func main() -> Int {
print("hello, White");
return 0;
}

Build it from that directory:

wlc hello.wl

On Windows, the output is hello.exe:

.\hello.exe

On Linux and macOS, the output has no suffix:

./hello

The program prints:

hello, White

What the file contains​

main is the entry point of an executable. It returns an Int; that value becomes the process exit status. Returning zero conventionally means success.

func main() -> Int {

print writes its arguments followed by a newline. It belongs to White's prelude, so this program does not need an import for it.

print("hello, White");

Statements end with a semicolon. Blocks use braces, and the closing brace does not take another semicolon.

Add a function​

The next version keeps main small and constructs the message in a separate function:

hello.wl
func greeting(name: String) -> String {
return "hello, " + name;
}

func main() -> Int {
let message = greeting("White");
print(message);
return 0;
}

Parameters use : between the name and type. The arrow following the parameter list is reserved for the return type. A declaration with an initializer may omit its type when the compiler can infer it, as message does here. Writing let message: Auto = ... is also valid when an explicit inferred type is useful.

Compile the file again with the same command. wlc replaces the previous output after the build succeeds.

Choose another output name​

Use -o when the executable should not be named after the source file:

wlc hello.wl -o greeting

On Windows, include the intended suffix:

wlc hello.wl -o greeting.exe

wlc reports compiler errors with the source file, line, column, and the part of the line which caused the problem. A failed frontend check does not proceed to native code generation or replace a successful output from an earlier build.