This immediately leave the proc when across something nil template safe(obj: typed, field: untyped): untyped = if obj.isNil: return `obj`.`field` type MyNullObj = ref object x: int proc main = var nullobj: MyNullObj var notnull = MyNullObj(x: 5) echo notnull.safe(x) echo "reach here" echo nullobj.safe(x) proc main2 = var nullobj: MyNullObj var notnull = MyNullObj(x: 5) echo nullobj.safe(x) echo "cannot reach here" echo notnull.safe(x) main2() main() Run
For proc that need to return something, have to set `result` in the function before hand, but `result` always has its default value so it's also ok