code: public final Iterable<V> getAllAccessibleVariables() {
      Map<String, V> accessibleVars = new LinkedHashMap<>();
      S s = thisScope();
  
      while (s != null) {
        for (V v : s.getVarIterable()) {
          accessibleVars.putIfAbsent(v.getName(), v);
        }
        s = s.getParent();
      }
      return accessibleVars.values();
    }
docs: Return an iterable over all of the variables accessible to this scope (i.e. the variables in
  this scope and its parent scopes). Any variables declared in the local scope with the same name
  as a variable declared in a parent scope gain precedence - if let x exists in the block scope,
  a declaration let x from the parent scope would not be included because the parent scope's
  variable gets shadowed.
  
  <p>The iterable contains variables from inner scopes before adding variables from outer parent
  scopes.
  
  <p>We do not include the special 'arguments' variable.