docs: def eval(lisp):
      '''
      plash lisp is one dimensional lisp.
      '''
      macro_values = []
      if not isinstance(lisp, list):
          raise EvalError('eval root element must be a list')
      for item in lisp:
          if not isinstance(item, list):
              raise EvalError('must evaluate list of list')
          if not all(isinstance(i, str) for i in item):
              raise EvalError(
                  'must evaluate list of list of strings. not a list of strings: {}'
                  .format(item))
          name = item[0]
          args = item[1:]
          try:
              macro = state['macros'][name]
          except KeyError:
              raise MacroNotFoundError("macro {} not found".format(repr(name)))
          try:
              res = macro(*args)
          except Exception as exc:
              if os.getenv('PLASH_DEBUG', '').lower() in ('1', 'yes', 'true'):
                  raise
              if isinstance(exc, MacroError):
                  # only raise that one time and don't have multiple wrapped MacroError
                  raise
              raise MacroError(macro, name, sys.exc_info())
          if not isinstance(res, str) and res is not None:
              raise EvalError(
                  'eval macro must return string or None ({} returned {})'.
                  format(name, type(res)))
          if res is not None:
              macro_values.append(res)
      return '\n'.join(macro_values)