@solve.implementation(for_type=ast.Bind)<EOL>def solve_bind(expr, vars):
value_expressions = []<EOL>keys = []<EOL>for pair in expr.children:<EOL><INDENT>keys.append(solve(pair.key, vars).value)<EOL>value_expressions.append(pair.value)<EOL><DEDENT>result = row_tuple.RowTuple(ordered_columns=keys)<EOL>intermediate_scope = scope.ScopeStack(vars, result)<EOL>for idx, value_expression in enumerate(value_expressions):<EOL><INDENT>value = solve(value_expression, intermediate_scope).value<EOL>result[keys[idx]] = value<EOL><DEDENT>return Result(result, ())<EOL>
Build a RowTuple from key/value pairs under the bind.

    The Bind subtree is arranged as follows:

    Bind
    | First KV Pair
    | | First Key Expression
    | | First Value Expression
    | Second KV Pair
    | | Second Key Expression
    | | Second Value Expression
    Etc...

    As we evaluate the subtree, each subsequent KV pair is evaluated with
    the all previous bingings already in scope. For example:

    bind(x: 5, y: x + 5)  # Will bind y = 10 because x is already available.