code: func walkNames(exp Expr) []string {
  	switch expr := exp.(type) {
  	case *VarRef:
  		return []string{expr.Val}
  	case *Call:
  		var a []string
  		for _, expr := range expr.Args {
  			if ref, ok := expr.(*VarRef); ok {
  				a = append(a, ref.Val)
  			}
  		}
  		return a
  	case *BinaryExpr:
  		var ret []string
  		ret = append(ret, walkNames(expr.LHS)...)
  		ret = append(ret, walkNames(expr.RHS)...)
  		return ret
  	case *ParenExpr:
  		return walkNames(expr.Expr)
  	}
  
  	return nil
  }
docs: // walkNames will walk the Expr and return the identifier names used.