Syntax: define [:: type] value

In addition to define (which can take an optional type specifier), Kawa has some extra definition forms.

Syntax: define-private name [:: type] value

Syntax: define-private (name formals) body

Same as define, except that name is not exported.

Syntax: define-constant name [:: type] value

Definites name to have the given value. The value is readonly, and you cannot assign to it. (This is not fully enforced.) If the definition is at module level, then the compiler will create a final field with the given name and type. The value is evaluated as normal; however, if it is a compile-time constant, it defaults to being static.

Syntax: define-variable name [init]

If init is specified and name does not have a global variable binding, then init is evaluated, and name bound to the result. Otherwise, the value bound to name does not change. (Note that init is not evaluated if name does have a global variable binding.)

Also, declares to the compiler that name will be looked up in the dynamic environment. This can be useful for shutting up warnings from --warn-undefined-variable.

This is similar to the Common Lisp defvar form. However, the Kawa version is (currently) only allowed at module level.

For define-namespace and define-private-namespace see Namespaces.