MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 1 | SYNOPSIS |
Zesstra | b6ac9f6 | 2020-01-21 11:11:16 +0100 | [diff] [blame] | 2 | void replace_program() |
| 3 | void replace_program(string program) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 4 | |
| 5 | BESCHREIBUNG |
| 6 | Ersetzt ein Programm mit dem geerbten Programm (inherit) <program>. |
| 7 | Das Argument <program> kann weggelassen werden, wenn nur ein Programm |
| 8 | geerbt wird. In diesem Fall waehlt der Treiber automatisch dieses eine |
| 9 | geerbte Programm. |
| 10 | |
| 11 | Diese Efun ist nuetzlich, wenn es um Leistung und Speicherverbrauch |
| 12 | des Treibers geht. Ein Programm, welches keine zusaetzlichen Variablen |
| 13 | oder Funktionen braucht (ausser waehrend der Erstellung), kann |
| 14 | replace_program() aufrufen, um die Trefferquote des Treibers auf den |
| 15 | Funktionen-Caches zu erhoehen. Dies verringert die Anzahl Programme |
| 16 | im System. |
| 17 | |
| 18 | Raeume sind ein gutes Beispiel fuer die Anwendung dieser Funktion, da |
| 19 | viele Raeume nur aus einem Inherit und einer Konfigurationsfunktion |
| 20 | bestehen. Jedes Objekt kann replace_program() aufrufen, verliert dabei |
| 21 | jedoch alle Variablen und Funktionen, die nicht im geerbten Programm |
| 22 | definiert sind. |
| 23 | |
| 24 | Wenn replace_program() angewendet wird, werden Shadows vom Objekt |
| 25 | entfernt, in dem replace_program() stattfindet. Dies ist so seit |
| 26 | 3.2@166. |
| 27 | |
| 28 | Es ist nicht moeglich, replace_program() aufzurufen, wenn es an das |
| 29 | Objekt gebundene (Lambda-) Closures gibt. Hingegen ist es moeglich, |
| 30 | zuerst das Programm des Objekts zu ersetzen und dann Lambdaclosures |
| 31 | daran zu binden. |
| 32 | |
| 33 | Das Ersetzen des Programms findet erst statt, wenn das Objekt |
| 34 | vollstaendig abgearbeitet wurde, nicht schon beim Aufruf der Funktion |
| 35 | replace_program(). Das kann dazu fuehren, dass Closures auf inzwischen |
| 36 | verschwundene Lfuns des Objekts referenzieren. Das stellt allerdings |
| 37 | kein Problem dar, solange diese Referenzen nicht ausgefuehrt werden. |
| 38 | |
Zesstra | b6ac9f6 | 2020-01-21 11:11:16 +0100 | [diff] [blame] | 39 | FEHLER |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 40 | Wenn ein ersetzendes Programm virtuell geerbte Variablen enthaelt, |
| 41 | muss dieses Programm als erstes geerbt werden. Ohne diese |
| 42 | Einschraenkung ueberleben die falschen Variablen den |
| 43 | Ersetzungsprozess. |
| 44 | |
Zesstra | b6ac9f6 | 2020-01-21 11:11:16 +0100 | [diff] [blame] | 45 | GESCHICHTE |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 46 | LDMud 3.2.9 liess zu, dass das Argument <program> weggelassen wird, |
| 47 | wenn nur ein Inherit existiert. |