blob: 808f0654677139958bb74a708ae35e36a11f66bd [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001SYNOPSIS
2 mixed * map(mixed *arg, string func, string|object ob, mixed extra...)
3 mixed * map(mixed *arg, closure cl, mixed extra...)
4 mixed * map(mixed *arg, mapping m [, int idx])
5
6 mixed * map(struct arg, string func, string|object ob, mixed extra...)
7 mixed * map(struct arg, closure cl, mixed extra...)
8 mixed * map(struct arg, mapping m [, int idx])
9
10 mapping map(mapping arg, string func, string|object ob, mixed extra...)
11 mapping map(mapping arg, closure cl, mixed extra...)
12
13 string map(string arg, string func, string|object ob, mixed extra...)
14 string map(string arg, closure cl, mixed extra...)
15 string map(string arg, mapping m [, int idx])
16
17BESCHREIBUNG
18 Ruft die Funktion <ob>-><func>() bzw. die Closure <cl> fuer jedes
19 Element des Strings, Arrays, Mappings oder der Struktur <arg> auf
20 und liefert ein Resultat, das aus den verschiedenen Rueckgabewerten
21 erstellt wurde.
22
23 Wurde <ob> nicht angegeben, oder ist es weder ein String noch ein
24 Objekt, wird stattdessen this_object() verwendet.
25
26 Ist <arg> ein Array, ein String oder eine Struktur, wird die Funktion
27 mit jedem Element des Arrays als erstem Parameter aufgerufen, gefolgt
28 von den <extra> Argumenten. Das Resultat der Efun ist ein Array, das
29 die Rueckgabewerte der Funktionsaufrufe enthaelt. Man koennte die
30 Operation map() deshalb umschreiben als:
31
32 foreach(index) result[index] = ob->func(arg[index], extra...)
33
34 Ist <arg> ein Array, ein String oder eine Struktur, und wurde statt
35 einer Funktion ein Mapping angegeben, so liefert map() ein Array mit
36 den Werten, die im Mapping an Stelle der urspruenglichen Werte stehen,
37 bzw. mit den Originalwerten, wenn fuer sie kein Mappingeintrag
38 existiert. Ist <idx> angegeben, so wird die entsprechende Spalte des
39 Mappings verwendet. Mit anderen Worten:
40
41 foreach(index)
42 if (arg[index] ist ein Key in <arg>)
43 result[index] = map[arg[index]] oder map[arg[index]]
44 else
45 result[index] = arg[index]
46
47 Ist <arg> ein Mapping, wird die Funktion fuer jeden Key des Mappings
48 als erstem Parameter und den Datenwerten (sofern vorhanden) als
49 zusaetzliche Argumente aufgerufen, gefolgt von den <extra> Argumenten.
50 Die <extra> Argumente duerfen keine geschuetzten Referenzen enthalten
51 (wie z.B. &(i[0])). Das Ergebnis der Efun ist ein Mapping, das die
52 Resultate der Funktionsaufrufe als Zuordnung zum jeweiligen Key
53 enthaelt.
54
55 Abhaengig von der Breite des Mappings <arg>, kann die Operation
56 umschrieben werden als:
57
58 foreach (key in arg)
59 switch (widthof(arg))
60 case 0:
61 result[key] = ob->func(key, 0, extra...)
62 case 1:
63 result[key] = ob->func(key, arg[key], extra...)
64 else :
65 result[key] = ob->func( key
66 , ({ arg[key,0] ...arg[key,width-1] })
67 , extra...)
68
69 Der Vorteil dieses Ansatzes ist, dass beide Arten von mehrdimensionalen
70 Mappings (Mappings mit mehreren Werten pro Key und Mappings von Arrays)
71 gleich behandelt werden koennen.
72
73BEISPIELE
74 arr = ({ 1, 2, 3, 4 });
75 m = ([ 1:-1, 3:-3 ]);
76
77 map(arr, #'%, 2) --> liefert ({ 1, 0, 1, 0 })
78 map(arr, m) --> liefert ([ -1, 2, -3, 4 })
79
80ANMERKUNGEN
81 map() auf Arrays angewandt verhaelt sich wie map_array(), auf Mappings
82 angewandt hingegen verhaelt es sich wie eine Verallgemeinerung von
83 map_indices().
84
85GESCHICHTE
86 Eingefuehrt in LDMud 3.2.6, loest map_array() ab.
87 LDMud 3.2.8 fuehrt neu die Moeglichkeit ein, ein Array durch ein
88 Mapping zu mappen.
89 LDMud 3.3.439 fuehrt map() fuer Strings ein.
90 LDMud 3.3.719 fuehrt den <idx>-Parameter fuer mappen mit Mappings ein.
91
92SIEHE AUCH
93 filter(E), filter_indices(E), map_indices(E), map_objects(E)