Exemplo n.º 1
0
OBJECT_PTR lit_id_metacont_fn(metacont_closure_t *mcls, reg_closure_t *cls)
{
  if(is_quoted_expression(mcls->closed_vals[0]))
  {
    OBJECT_PTR i_sym = gensym();
    
    return list(3,
                LET,
                list(1, list(2, i_sym, mcls->closed_vals[0])),
                cls->fn(cls, i_sym));
  }
  else
    return cls->fn(cls, mcls->closed_vals[0]);
}
Exemplo n.º 2
0
data_t *eval(const data_t *exp, data_t *env) {
	if(eval_plz_die) {
		eval_plz_die = 0;
		ExitThread(0);
	}

	if(is_self_evaluating(exp))
		return (data_t*)exp;
	if(is_variable(exp))
		return lookup_variable_value(exp, env);
	if(is_quoted_expression(exp))
		return get_text_of_quotation(exp);
	if(is_assignment(exp))
		return eval_assignment(exp, env);
	if(is_definition(exp))
		return eval_definition(exp, env);
	if(is_if(exp))
		return eval_if(exp, env);
	if(is_lambda(exp))
		return make_procedure(get_lambda_parameters(exp), get_lambda_body(exp), env);
	if(is_begin(exp))
		return eval_sequence(get_begin_actions(exp), env);
	if(is_cond(exp))
		return eval(cond_to_if(exp), env);
	if(is_letrec(exp))
		return eval(letrec_to_let(exp), env);
	if(is_let_star(exp))
		return eval(let_star_to_nested_lets(exp), env);
	if(is_let(exp))
		return eval(let_to_combination(exp), env);
	if(is_application(exp))		
		return apply(
			eval(get_operator(exp), env),
			get_list_of_values(get_operands(exp), env));
	
	printf("Unknown expression type -- EVAL '");
	return make_symbol("error");
}
Exemplo n.º 3
0
metacont_closure_t *mcps(OBJECT_PTR exp)
{
  if(is_atom(exp) || is_quoted_expression(exp))
  {
    metacont_closure_t *mcls = (metacont_closure_t *)GC_MALLOC(sizeof(metacont_closure_t));

    mcls->mfn             = lit_id_metacont_fn;

    mcls->nof_closed_vals = 1;
    mcls->closed_vals     = (OBJECT_PTR *)GC_MALLOC(mcls->nof_closed_vals * sizeof(OBJECT_PTR));

    mcls->closed_vals[0]  = exp;
    
    return mcls;
  }
    
  OBJECT_PTR car_exp = car(exp);
  
  if(car_exp == LAMBDA)
  {
    metacont_closure_t *mcls = (metacont_closure_t *)GC_MALLOC(sizeof(metacont_closure_t));

    mcls->mfn             = lambda_metacont_fn;

    mcls->nof_closed_vals = 2;
    mcls->closed_vals     = (OBJECT_PTR *)GC_MALLOC(mcls->nof_closed_vals * sizeof(OBJECT_PTR));

    mcls->closed_vals[0]  = second(exp);
    mcls->closed_vals[1]  = third(exp);
    
    return mcls;    
  }

  if(car_exp == LET)
  {
    metacont_closure_t *mcls = (metacont_closure_t *)GC_MALLOC(sizeof(metacont_closure_t));

    mcls->mfn             = let_metacont_fn;

    mcls->nof_closed_vals = 2;
    mcls->closed_vals     = (OBJECT_PTR *)GC_MALLOC(mcls->nof_closed_vals * sizeof(OBJECT_PTR));

    mcls->closed_vals[0]  = second(exp);
    mcls->closed_vals[1]  = third(exp);
    
    return mcls;
  }

  if(primop(car_exp))
  {
    if(car_exp == RETURN_FROM)
    {
      metacont_closure_t *mcls = (metacont_closure_t *)GC_MALLOC(sizeof(metacont_closure_t));

      mcls->mfn             = return_from_metacont_fn;

      mcls->nof_closed_vals = 1;
      mcls->closed_vals     = (OBJECT_PTR *)GC_MALLOC(mcls->nof_closed_vals * sizeof(OBJECT_PTR));

      mcls->closed_vals[0]  = exp;
    
      return mcls;      
    }
    else if(car_exp == THROW)
    {
      metacont_closure_t *mcls = (metacont_closure_t *)GC_MALLOC(sizeof(metacont_closure_t));

      mcls->mfn             = throw_metacont_fn;

      mcls->nof_closed_vals = 1;
      mcls->closed_vals     = (OBJECT_PTR *)GC_MALLOC(mcls->nof_closed_vals * sizeof(OBJECT_PTR));

      mcls->closed_vals[0]  = second(exp);
    
      return mcls;      
    }
    else if(car_exp == CALL_CC)
    {
      metacont_closure_t *mcls = (metacont_closure_t *)GC_MALLOC(sizeof(metacont_closure_t));

      mcls->mfn             = call_cc_metacont_fn;

      mcls->nof_closed_vals = 1;
      mcls->closed_vals     = (OBJECT_PTR *)GC_MALLOC(mcls->nof_closed_vals * sizeof(OBJECT_PTR));

      mcls->closed_vals[0]  = second(exp);
    
      return mcls;      
    }
    else if(car_exp == BREAK)
    {
      metacont_closure_t *mcls = (metacont_closure_t *)GC_MALLOC(sizeof(metacont_closure_t));

      mcls->mfn             = break_metacont_fn;

      mcls->nof_closed_vals = 0;
      mcls->closed_vals     = NULL;
    
      return mcls;      
    }    
    else
    {
      metacont_closure_t *mcls = (metacont_closure_t *)GC_MALLOC(sizeof(metacont_closure_t));

      mcls->mfn             = primop_metacont_fn;

      mcls->nof_closed_vals = 2;
      mcls->closed_vals     = (OBJECT_PTR *)GC_MALLOC(mcls->nof_closed_vals * sizeof(OBJECT_PTR));

      mcls->closed_vals[0]  = car_exp;  //operator
      mcls->closed_vals[1]  = cdr(exp); //operands
    
      return mcls;
    }
  }
  
  if(car_exp == IF)
  {
    metacont_closure_t *mcls = (metacont_closure_t *)GC_MALLOC(sizeof(metacont_closure_t));

    mcls->mfn             = if_metacont_fn;

    mcls->nof_closed_vals = 3;
    mcls->closed_vals     = (OBJECT_PTR *)GC_MALLOC(mcls->nof_closed_vals * sizeof(OBJECT_PTR));

    mcls->closed_vals[0]  = second(exp);
    mcls->closed_vals[1]  = third(exp);
    mcls->closed_vals[2]  = fourth(exp);
    
    return mcls;    
  }

#ifdef WIN32
  if(car_exp == ERROR1)
#else
  if(car_exp == ERROR)
#endif    
  {
    metacont_closure_t *mcls = (metacont_closure_t *)GC_MALLOC(sizeof(metacont_closure_t));

    mcls->mfn             = error_metacont_fn;

    mcls->nof_closed_vals = 1;
    mcls->closed_vals     = (OBJECT_PTR *)GC_MALLOC(mcls->nof_closed_vals * sizeof(OBJECT_PTR));

    mcls->closed_vals[0]  = second(exp);
    
    return mcls;
  }

  //it is an application
  metacont_closure_t *mcls = (metacont_closure_t *)GC_MALLOC(sizeof(metacont_closure_t));

  mcls->mfn             = app_metacont_fn;

  mcls->nof_closed_vals = 1;
  mcls->closed_vals     = (OBJECT_PTR *)GC_MALLOC(mcls->nof_closed_vals * sizeof(OBJECT_PTR));

  mcls->closed_vals[0]  = exp;
    
  return mcls;
}