def list_subscripting():
    list_var = gen.str_gen.next()
    element_name, seq_gen = \
        random.choice([("element", gen.list_gen), ("character", gen.str_gen)])
    a_list = gen.make_filter(lambda seq: len(seq) > 0)(seq_gen).next()
    index = random.randrange(len(a_list))
    position_func = random_position_func()
    position = position_func(index, element_name)
    message = "Let {var} = {value!r}. Select the {position} in {var}."

    def question():
        text = message.format(var=list_var, value=a_list, position=position)
        show_text(text)
        answer = raw_input(">>> ")
        parsed_answer = ast.parse(answer)
        list_name_correct = parsed_answer.body[0].value.value.id == list_var
        list_index_correct = parsed_answer.body[0].value.slice.value.n == index
        return list_name_correct and list_index_correct
    return question
def list_subscripting():
    list_var = gen.str_gen.next()
    element_name, seq_gen = \
        random.choice([("element", gen.list_gen), ("character", gen.str_gen)])
    a_list = gen.make_filter(lambda seq: len(seq) > 0)(seq_gen).next()
    index = random.randrange(len(a_list))
    position_func = random_position_func()
    position = position_func(index, element_name)
    message = "Let {var} = {value!r}. Select the {position} in {var}."

    def question():
        text = message.format(var=list_var, value=a_list, position=position)
        show_text(text)
        answer = raw_input(">>> ")
        parsed_answer = ast.parse(answer)
        list_name_correct = parsed_answer.body[0].value.value.id == list_var
        list_index_correct = parsed_answer.body[0].value.slice.value.n == index
        return list_name_correct and list_index_correct

    return question
def simple_slicing():
    seq_var = gen.str_gen.next()
    element_name, seq_gen = \
        random.choice([("element", gen.list_gen), ("character", gen.str_gen)])
    seq = gen.make_filter(lambda seq: len(seq) > 0)(seq_gen).next()
    start_index = random.randrange(len(seq))
    stop_index = random.randrange(start_index, len(seq)) + 1
    template = "We have {var} = {value!r}. Select the range from the " \
        "{start_pos} up to, but not including, the {end_pos}."
    start_position = random_position_func()(start_index, element_name)
    stop_position = random_position_func()(stop_index, element_name)
    text = template.format(var=seq_var, value=seq, start_pos=start_position,
                           end_pos=stop_position)

    def question():
        show_text(text)
        answer = raw_input(">>> ")
        parsed_answer = ast.parse(answer)
        parsed_expr = parsed_answer.body[0].value
        seq_name_correct = parsed_expr.value.id == seq_var
        slice_start_correct = parsed_expr.slice.lower.n == start_index
        slice_stop_correct = parsed_expr.slice.upper.n == stop_index
        return seq_name_correct and slice_start_correct and slice_stop_correct
    return question