code: def dissociate(op, args):
      
      result = []
      def collect(subargs):
          for arg in subargs:
              if arg.op == op: collect(arg.args)
              else: result.append(arg)
      collect(args)
      return result
docs: Given an associative op, return a flattened list result such
      that Expr(op, *result) means the same as Expr(op, *args).