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)); } }
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; }