In Argentum, associative reference (also known as weak) is one of fundamental built-in types. Such reference is easily created, copied, passed, and stored. It is not a pointer, it is rather a Schrodinger box that may or may not have a pointer inside:
class MyClass {
i = 42;
field = &MyClass; // field; weak reference; "empty"
}
a = &MyClass; // local variable; weak; "empty"
realObject = MyClass; // temporary pointer to a freshly created instance of `MyClass`
a := &realObject; // now `a` holds a pointer to the `realObject`
realObject.field := a; // now the object's field points to itself (which is ok for weaks)The process of &-weak dereferencing includes:
- checking that &-weak actually has pointer to something,
- that its target still exists,
- and that it resides in the same thread.
The result of these checks is a temporary reference to the object, wrapped in an optional (?T) , which not only signals the availability of the object through this reference but also prevents its deletion.
The above-described dereferencing has no explicit syntax. It is performed automatically wherever &T is transformed into ?T. For example, in the "?" or ":"-operators:
// If `a` points to an object, print its field `i`
a ? log("This object exists and has i={_.i}");Here, the ?-operator expects to get ?T on the left, so the &weak variable a will be locked, and on success, it will be passed to the right operand as "_" variable of type MyClass where _.i extracts its field.
As a result:
- In Argentum, it is impossible to access lost weak references.
- This check has lightweight syntax.
- It generates a temporary value ("
_" or a name defined by the programmer through?`name), and this temporary name has a lifetime limited by the right operand of the ? operator.
