code: func (v *evalVisitor) evalDepthPath(depth int, parts []string, exprRoot bool) interface{} {
  	var result interface{}
  	partResolved := false
  
  	ctx := v.ancestorCtx(depth)
  
  	for (result == nil) && ctx.IsValid() && (depth <= len(v.ctx) && !partResolved) {
  		// try with context
  		result, partResolved = v.evalCtxPath(ctx, parts, exprRoot)
  
  		// As soon as we find the first part of a path, we must not try to resolve with parent context if result is finally `nil`
  		// Reference: "Dotted Names - Context Precedence" mustache test
  		if !partResolved && (result == nil) {
  			// try with previous context
  			depth++
  			ctx = v.ancestorCtx(depth)
  		}
  	}
  
  	return result
  }
docs: // evalDepthPath iterates on contexts, starting at given depth, until there is one that resolve given path parts