SCM SCM_list (unsigned long count, va_list arguments) {
  if ( count == 0 ) { 
    return SCM_nil;
  } else {
    SCM arg = va_arg(arguments,SCM);
    return SCM_cons(arg,SCM_list(count-1,arguments));
  }
}
Beispiel #2
0
object *
copy_object (object *obj)
{
    object *ret = NULL;
    if (NULL == obj)
        return NULL;
    else if (SCM_VOID == obj->type)
        ret = SCM_void ();
    else if (SCM_ERROR == obj->type)
        ret = SCM_error (((error_object *) obj)->error,
                         ((error_object *) obj)->msg);
    else if (SCM_ATOM == obj->type)
        ret = SCM_atom (((atom_object *) obj)->name);
    else if (SCM_BOOL == obj->type)
        ret = SCM_bool (((bool_object *) obj)->value);
    else if (SCM_VARIABLE == obj->type)
        ret = SCM_variable (((variable_object *) obj)->name,
                            copy_object (((variable_object *) obj)->value));
    else if (SCM_NUMBER == obj->type)
        ret = SCM_number_from_double (((number_object *) obj)->num);
    else if (SCM_STRING == obj->type)
        ret = SCM_string (((string_object *) obj)->str);
    else if (SCM_PAIR == obj->type)
        ret = SCM_cons (copy_object (car (obj)), copy_object (cdr (obj)));
    else if (SCM_FUNC == obj->type)
        ret = SCM_func (((func_object *) obj)->fn);
    else if (SCM_LAMBDA == obj->type)
        ret = SCM_lambda (copy_object (((lambda_object *) obj)->args),
                          copy_object (((lambda_object *) obj)->sexp));
    else
    {
        print_fatal (ETYPE);
        exit (1);
    }

    return ret;
}