void move_or_destruct(object what, object to)
/* An error in this function can be very nasty. Note that unlimited recursion
 * is likely to cause errors when environments are deeply nested
 */
{
// COMPAT_FLAG should be off, I don't know what's wrong...
//#ifdef COMPAT_FLAG
//    do {
//        int res;
//        if (catch( res = transfer(what, to) )) res = 5;
//        if ( !(res && what) ) return;
//    } while( (res == 1 || res == 4 || res == 5) && (to = environment(to)) );
//#else /* !COMPAT_FLAG */
    if ( !catch( what->move(to, 1) ) ) return;
//#endif /*COMPAT_FLAG */
    
    /*
     * Failed to move the object. Then, it is destroyed.
     */
    destruct(what);
}
