docs: def _parse_var_dict(self, var_tbl: dict) -> dict:
          """
          Create an extended list of variable names including any pre-bound ones
          Throws an error if a variable is unbound
          Returns inferred dict of variable: val pairs
          """
          var_names = var_tbl.copy()
          # check that all of the variables are bound
          for v in self.var_names:
              if v not in var_tbl:
                  if self.var_names[v] is None:
                      raise(KeyError("variable " + v + " is unbound"))
                  else:
                      var_names[v] = self.var_names[v]
          # squeeze the variables
          return self._squeeze(var_names)