<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def projection(table, exprs):
 """ Compute new table expression with the indicated column expressions from this table. Parameters exprs : column expression, or string, or list of column expressions and strings. If strings passed, must be columns in the table already Returns ------- projection : TableExpr Notes ----- Passing an aggregate function to this method will broadcast the aggregate's value over the number of rows in the table. See the examples section for more details. Examples -------- Simple projection ref_0 UnboundTable[table] name: t schema: a : int64 b : float64 <BLANKLINE> Selection[table] table: Table: ref_0 selections: a = Column[int64*] 'a' from table ref_0 b_plus_1 = Add[float64*] left: b = Column[float64*] 'b' from table ref_0 right: Literal[int8] 1 True Aggregate projection ref_0 UnboundTable[table] name: t schema: a : int64 b : float64 <BLANKLINE> Selection[table] table: Table: ref_0 selections: sum_a = WindowOp[int64*] sum_a = Sum[int64] a = Column[int64*] 'a' from table ref_0 where: None mean_b = WindowOp[float64*] mean_b = Mean[float64] b = Column[float64*] 'b' from table ref_0 where: None Note the ``<ibis.expr.window.Window>`` objects here, their existence means that the result of the aggregation will be broadcast across the number of rows in the input column. The purpose of this expression rewrite is to make it easy to write column/scalar-aggregate operations like .. code-block:: python t[(t.a - t.a.mean()).name('demeaned_a')] """

    import ibis.expr.analysis as L

    if isinstance(exprs, (Expr, str)):
        exprs = [exprs]

    projector = L.Projector(table, exprs)

    op = projector.get_result()
    return op.to_expr()