This module allows chains of field-access and indexing where the LHS can be nil. This simplifies code by reducing need for if-else branches around intermediate values that maybe be nil.
Note: experimental module and relies on {.experimental: "dotOperators".} Unstable API.
Example:
type Foo = ref object x1: string x2: Foo x3: ref int var f: Foo assert ?.f.x2.x1 == "" # returns default value since `f` is nil var f2 = Foo(x1: "a") f2.x2 = f2 assert ?.f2.x1 == "a" # same as f2.x1 (no nil LHS in this chain) assert ?.Foo(x1: "a").x1 == "a" # can use constructor inside # when you know a sub-expression is not nil, you can scope it as follows: assert ?.(f2.x2.x2).x3[] == 0 # because `f` is nil