walk_mapping(E)

FUNKTION:
        void walk_mapping(mapping m, string fun [, mixed extra, ...])
        void walk_mapping(mapping m, string fun, string|object ob
                                                , mixed extra,...)
        void walk_mapping(mapping m, closure cl, mixed extra,...)

PARAMETER:
     m		- durchzugehendes Mapping
     fun/cl	- zu rufende Methode/Closure
     ob		- Objekt/Dateiname, an dem Methode gerufen werden soll
     extra	- weitere Parameter fuer Methode/Closure

BESCHREIBUNG:
     Ruft die Methode fuer jeden Eintrag im Mapping:
      ob->func(key, value1, ..., valueN, extra,...)
     beziehungsweise fuehrt die Closure fuer jeden dieser Eintraege aus:
      funcall(cl, key, value1, ..., valueN, extra,...)

     Die Schluessel werden als Wert uebergeben und die dazugehoerigen Werte
     per Referenz, diese koennen somit also in der Funktion/Closure geaendert
     werden.


     Verwendung von Methoden:
	Wenn bei der Angabe von 'fun' kein Objekt 'ob' in Form eines Strings
	oder Objekts angegeben wird, wird this_object() angenommen.

     Verwendung von Closures:
	Es koennen sowohl Lfun-Closures als auch Lambda-Closures verwendet
	werden. Lfun-Closures koennen, wenn im selben Objekt vorhanden auch
	'private' oder/und 'static' deklariert sein, muessen aber zu dem
	Zeitpunkt der Verwendung bekannt sein (Funktionsprototypen benutzen).

BEISPIELE:
     // Liste mit Spielern durchgehen ...
     mapping x=([ [/human:liafar]:  20,
		  [/dwarf:mesirii]: 50,
		  [/elf:zarniya]:   40,
		  [/feline:turbo]:  30]);

     // ... und Werte aendern:
     void add_val(object key, int val, int add) {
       if(key->InFight())
         val+=add;
       else
         val-=add;
     }

     // verschiedene Aufrufarten, identisches Resultat:
     walk_mapping(x, "add_val", 0, 10);
     walk_mapping(x, "add_val", this_object(), 10
     walk_mapping(x, "add_val", "/players/jof/addierobjektmitmethode", 10);

     walk_mapping(x, #'add_val, 10);


AeQUIVALENZCODE (nicht empfohlen, nur zum Verstaendnis!):
     // so richtig aequivalent wird es nur mit einer Closure hier
     int i, width;
     mapping input;
     mixed *index, *param;

     width=get_type_info(input)[1];
     param=allocate(width);
     index=m_indices(input);
     i=sizeof(index);
     while(i--) {
       j=width;
       while(j-- > 1)
         param[j]=input[index[i],j];
       j[0]=index[i];

       apply(cl, param);
       // fun(index[i], input[index[i],0], input[index[i],1], ...);
      }

SIEHE AUCH:
     Arrays:		filter(E), map(E)
     Objektarrays:	filter_objects(E), map_objects(E)
     Mappings:		filter_indices(E), map_indices(E)

     Sonstiges:		m_contains(E)
			member()
			m_indices(E), m_values(E)

20.Jan 2005 Gloinson
