code: def eval(self, amplstatements, **kwargs):
          
          if self._langext is not None:
              amplstatements = self._langext.translate(amplstatements, **kwargs)
          lock_and_call(
              lambda: self._impl.eval(amplstatements),
              self._lock
          )
          self._errorhandler_wrapper.check()
docs: Parses AMPL code and evaluates it as a possibly empty sequence of AMPL
          declarations and statements.
  
          As a side effect, it invalidates all entities (as the passed statements
          can contain any arbitrary command); the lists of entities will be
          re-populated lazily (at first access)
  
          The output of interpreting the statements is passed to the current
          OutputHandler (see getOutputHandler and
          setOutputHandler).
  
          By default, errors and warnings are printed on stdout.
          This behavior can be changed reassigning an ErrorHandler
          using setErrorHandler.
  
          Args:
            amplstatements: A collection of AMPL statements and declarations to
            be passed to the interpreter.
  
          Raises:
            RuntimeError: if the input is not a complete AMPL statement (e.g.
            if it does not end with semicolon) or if the underlying
            interpreter is not running.