예제 #1
0
SCM SCM_apply (unsigned long number, va_list arguments) {
  SCM args[31];
  SCM last_arg;
  SCM fun = va_arg(arguments,SCM);
  unsigned long i;
  for ( i=0 ; i<number-1 ; i++  ) {
    args[i] = va_arg(arguments,SCM);
  }
  last_arg = args[--i];
  while ( SCM_PairP(last_arg) ) {
    args[i++] = SCM_Car(last_arg);
    last_arg = SCM_Cdr(last_arg);
  }
  if ( ! SCM_NullP(last_arg) ) {
    SCM_error(SCM_ERR_APPLY_ARG);
  }
  switch ( i ) {
  case 0: return SCM_invoke(fun,0);
  case 1: return SCM_invoke(fun,1,args[0]);
  case 2: return SCM_invoke(fun,2,args[0],args[1]);
  case 3: return SCM_invoke(fun,3,args[0],args[1],args[2]);
  case 4: return SCM_invoke(fun,4,args[0],args[1],args[2],args[3]);
  case 5: return SCM_invoke(fun,5,args[0],args[1],args[2],args[3],
                            args[4]);
  case 6: return SCM_invoke(fun,6,args[0],args[1],args[2],args[3],
                            args[4],args[5]);
  case 7: return SCM_invoke(fun,7,args[0],args[1],args[2],args[3],
                            args[4],args[5],args[6]);
  case 8: return SCM_invoke(fun,8,args[0],args[1],args[2],args[3],
                            args[4],args[5],args[6],args[7]);
  case 9: return SCM_invoke(fun,9,args[0],args[1],args[2],args[3],
                             args[4],args[5],args[6],args[7],args[8]);
  case 10: return SCM_invoke(fun,10,args[0],args[1],args[2],args[3],
                             args[4],args[5],args[6],args[7],args[8],args[9]);
  case 11: return SCM_invoke(fun,11,args[0],args[1],args[2],args[3],
                             args[4],args[5],args[6],args[7],args[8],args[9],
                             args[10]);
  case 12: return SCM_invoke(fun,12,args[0],args[1],args[2],args[3],
                             args[4],args[5],args[6],args[7],args[8],args[9],
                             args[10],args[11]);
  case 13: return SCM_invoke(fun,13,args[0],args[1],args[2],args[3],
                             args[4],args[5],args[6],args[7],args[8],args[9],
                             args[10],args[11],args[12]);
  case 14: return SCM_invoke(fun,14,args[0],args[1],args[2],args[3],
                             args[4],args[5],args[6],args[7],args[8],args[9],
                             args[10],args[11],args[12],args[13]);
  /* If this were less cumbersome, I will add cases up to 31. */
  default: return SCM_error(SCM_ERR_APPLY_SIZE);
  }
}
예제 #2
0
SCM SCM_cdr (SCM x) { 
  if ( SCM_PairP(x) ) { 
    return SCM_Cdr(x);
  } else return SCM_error(SCM_ERR_CDR);
}
예제 #3
0
SCM SCM_set_cdr (SCM x, SCM y) {
  if ( SCM_PairP(x) ) {
    SCM_Unwrap(x)->pair.cdr = y;
    return x;
  } else return SCM_error(SCM_ERR_SET_CDR);
}
예제 #4
0
SCM SCM_car (SCM x) {
  if ( SCM_PairP(x) ) { 
    return SCM_Car(x);
  } else return SCM_error(SCM_ERR_CAR);
}