| // Every declaration of a variable, function, or type is of the following form: |
| // name : kind = definition |
| // where the components mean (and most are optional): |
| // name is the name being declared |
| // kind is the kind of entity being declared |
| // definition can be any expression, including a block expression |
| |
| // For example, these are declaration statements (and definitions): |
| |
| widget: type = int; // define a type |
| |
| x: widget = 42; // a named variable |
| |
| shape: type = { x: int; y: int; } // a named type |
| |
| add: (x:_, y:_) = { return x+y; } // a named generic function |
| |
| // add: (x, y) = x+y; // same, using defaults |
| |
| // In expression scope, omit name to declare an unnamed entity. For example, these are declaration expressions: |
| :widget = 42; // an unnamed (temporary) object expression |
| |
| :type = { x: int; y: int; } // an unnamed type expression |
| |
| //:(x, y) = x+y // an unnamed (lambda) function expression |
| |
| // Note These : expressions have very low precedence, so a trailing ; is not needed when lambdas are passed as arguments. |
| // A local variable declaration statement may omit kind or definition. |
| // If kind is omitted, it is deduced as if specified _. |
| // If = definition is omitted, name must be defined by initialization before use (see §3.4.1). For example: |
| |
| y : int = 42; // y is an int with initial value 42 |
| |
| z : = 42; // z, the same, “_” is implicit default |
| |
| w := 42; // same, stylistic convenience |
| |
| // s: string; // declares s, unconstructed |
| |
| // t = f(); // constructs t, definite first use |