Ejemplo n.º 1
0
 def test_pair_from_list(self):
     s1 = symbol('s1')
     s2 = symbol('s2')
     p = list_to_pair([s1, s2])
     self.assertEquals(p.car_w(), s1)
     self.assertEquals(p.cdr_w().car_w(), s2)
     self.assertEquals(p.cdr_w().cdr_w(), w_nil)
Ejemplo n.º 2
0
 def test_pair_from_list(self):
     s1 = symbol("s1")
     s2 = symbol("s2")
     p = list_to_pair([s1, s2])
     self.assertEquals(p.car_w(), s1)
     self.assertEquals(p.cdr_w().car_w(), s2)
     self.assertEquals(p.cdr_w().cdr_w(), w_nil)
Ejemplo n.º 3
0
def build_def(w_form, w_args):
    if len(w_args) < 2:
        raise W_ValueError('define requires at least 2 args',
                           w_form, 'build_def()').wrap()
    w_first = w_args[0]
    if isinstance(w_first, W_Symbol): # is symbol, a normal define
        if len(w_args) != 2:
            raise W_ValueError('define variable requires 2 args',
                               w_form, 'build_def()').wrap()
        w_name = w_first
        form = w_args[1].to_ast()
    elif isinstance(w_first, W_Pair): # is pair, we are defining lambda
        name_formals_w, w_rest = w_first.to_list()
        w_name = name_formals_w[0]
        formals_w = list_to_pair(name_formals_w[1:], w_rest)
        w_lambda_form = [formals_w] + w_args[1:]
        form = build_lambda(w_form, w_lambda_form)
    else:
        raise W_TypeError('Pair or Symbol', w_first, 'build_def()').wrap()

    if not isinstance(w_name, W_Symbol):
        raise W_TypeError('Symbol', w_name, 'build_def()').wrap()
    if isinstance(form, Lambda):
        form.name = w_name.sval
    return Def(Var(w_name), form)