Hello, world! ============= This is the all-important "Hello, world!" program in Roto: .. code-block:: roto fn main() { print("Hello, world!"); } You can put this code in a file called ``hello_world.roto`` and then run it with the following command: .. code-block:: console $ roto run hello_world.roto Which should show you the following output: .. testoutput:: Hello, world! There are a couple things we can learn from this program. First, a function is defined with the ``fn`` keyword and we use curly braces to delimit the function body. Second, functions (in this case ``print``) are called with parentheses and string literals are enclosed in double quotes. Finally, a statement in Roto ends with a semicolon. Roto ignores whitespace as it parses the source code, so the indentation of the second line is completely optional. You can see Roto's type checker at work if you change the script to the following: .. code-block:: roto :class: test-error fn main() { print(5); } If you try to compile that script, Roto will show you the following error: .. code-block:: Error: Type error: mismatched types ╭─[ hello_world.roto:2:11 ] │ 2 │ print(5); │ ┬ │ ╰── expected `String`, found `{integer}` ───╯ This is a *compile-time* error, which is generated before the script is run. This is part of the appeal of Roto: your scripts will be checked up front, so they won't present problems later. We can also use the compiler to only check our program without running it: .. code-block:: console $ roto check hello_world.roto Now you know how to run and check Roto scripts. You can look at the :doc:`../reference/language_reference` to learn the rest of the language.