Procedure Signatures

Of course, the most obvious reason to create a new Module is to factor out some logic for the sake of making it reusable in multiple places in your program, or even just to keep another Module's implementation from growing in size indefinitely. So, the first thing that you're likely to export from a Module are procedures. To do so, you will simply declare the signature of the procedure(s) to be exported - that is, everything but the implementation of the procedure. A procedure signature ends with a ; instead of the usual implementation logic inside curly braces.

For example, the following signatures are exported from the StdLib's strings module:

Fig 1:

# strings.claro_module_api

function fromChar(c: char) -> string;
function charAt(s: string, i: int) -> char;

# ...

Including a procedure signature in a Module's API file is a declaration that any dependent of this Module will have access to a procedure with the given signature, so Claro will statically validate that any claro_module(...) target exporting any procedure signatures actually implements that procedure within its given srcs.

So, your build target will be required to declare which .claro source file(s) actually implement the exported procedures as explained in the introduction to defining Modules.