| """The type of the [[null]] value. Any union type of form |
| `Null|T` is considered an _optional_ type, whose values |
| include `null`. Any type of this form may be written as |
| `T?` for convenience. |
| |
| The `if (exists ... )` construct, or, alternatively, |
| `assert (exists ...)`, may be used to narrow an optional |
| type to a _definite_ type, that is, a subtype of |
| [[Object]]: |
| |
| String? firstArg = process.arguments.first; |
| if (exists firstArg) { |
| print("hello " + firstArg); |
| } |
| |
| The `else` operator evaluates its second operand if and |
| only if its first operand is `null`: |
| |
| String name = process.arguments.first else "world"; |
| |
| The `then` operator evaluates its second operand when |
| its first operand evaluates to `true`, and produces `null` |
| otherwise: |
| |
| Float? diff = x>=y then x-y; |
| |
| The `?.` operator may be used to evaluate an attribute |
| or invoke a method of an optional type, evaluating to |
| `null` when the receiver is missing: |
| |
| value [firstName, lastName] = |
| let (fullName = process.arguments.first?.trimmed, |
| bits = fullName?.split()?.sequence() else []) |
| [bits[0], bits[1]]; |
| assert (exists firstName, exists lastName); |
| |
| No equivalence relation is defined for `Null`. In |
| particular, neither `null==null` nor `null===null` are |
| considered meaningful. Therefore, `Null` is neither |
| [[Identifiable]], nor does it define |
| [[value equality|Object.equals]].""" |
| see (`value null`) |
| by ("Gavin") |
| tagged("Basic types") |
| shared abstract class Null() |
| of null |
| extends Anything() {} |
| |
| "The null value." |
| by ("Gavin") |
| tagged("Basic types") |
| shared object null extends Null() {} |
| |