filter
******


BEMERKUNGEN
===========

   1. Achtung, die Elemente in 'arr' werden nicht tief kopiert, sind
      sie also selbst Arrays oder Mappings, so fuehrt eine spaetere
      Aenderung im Rueckgabe-Arrays zur Aenderung im Ursprungsarray:

         int *i, *j;
         i=({({1,2,3}),({4,5,6})});
         j=filter(i, #'sizeof);     // filtert leere Arrays heraus
         j[0][0]=8;

      fuehrt zu: i==j==({({8,2,3}),({4,5,6})});

   2. Das Kopieren in das Rueckgabemapping erfolgt fuer jedes Element
      nach Ausfuehrung der Filtermethode. Aenderungen der Werte im
      Array in dieser Methode (globale Variable/Uebergabe als Referenz
      an filter) schlagen sich also im Rueckgabearray nieder.

   3. Fuer Arrays wirkt filter() wie filter_array(), fuer Mappings
      stellt filter() eine Verallgemeinerung von filter_indices() dar.


BEISPIELE
=========

   ### Filtere alle Lebewesen in einem Raum in ein Array ###
   filter(all_inventory(this_object()),#'living);

   ### Filtere alle tauben Spieler im Raum in ein Array ###
   static int filter_isdeaf(object who) {
     return (interactive(who) && who->QueryProp(P_DEAF));
   }

   filter(all_inventory(this_object()), #'filter_isdeaf);


   ### Filtern von Idlern (>=1 Sekunde idle) ###
   // Folgend identische Resultate, aber andere Ansaetze:

   #1: nutzt die Efun query_idle() als Lfun-Closure (ideal hier)
       idle_usr = filter(users(), #'query_idle );

   #2: mit Filtermethode
       int check_if_idle(object user) {
         return query_idle(user);
       }

       #2a: filtert mittels der Lfun im selben Objekt die Idler in das
            Rueckgabearray
            idle_usr = filter(users(), "check_if_idle");
            idle_usr = filter(users(), "check_if_idle", this_object());

       #2b: ruft die Lfun check_if_idle() als Lfun-Closure (Funktions-
            pointer)
            idle_usr = filter(users(), #'check_if_idle );

   #3: Nutzt eine Inline-Closure
       idle_usr = filter(users(), function int (object user) {
                    return query_idle(user);
                  } );

   ### Filtern von Idlern (>=20 Sekunden idle) mit Extraparameter ###
   // Folgend identische Resultate, aber andere Ansaetze:

   #1: die Efun koennen wir nicht mehr direkt nutzen, weil sie
       diesen Parameter nicht unterstuetzt
      // idle_usr = filter(users(), #'query_idle );

   #2: mit separater Filtermethode ... mit neuem Parameter
       int check_if_idle(object user, int length) {
         return query_idle(user)>length;
       }

       #2a: filtert mittels der Lfun im selben Objekt die Idler in das
            Rueckgabearray ... mit drittem Parameter!
            idle_usr = filter(users(), "check_if_idle", this_object(), 20);

       #2b: ruft die Lfun check_if_idle() als Lfun-Closure (Funktions-
            pointer)
            idle_usr = filter(users(), #'check_if_idle, 20);

   #3: Nutzt eine Inline-Closure
       idle_usr = filter(users(), function int (object user, int length) {
                    return (query_idle(user) > length);
                    }, 20);
