IF-Forum

» IF-Forum - Autorencafé - Schreiben! - ScopeWithin(ALLE) ??
AntwortenNeues ThemaNeue Umfrage

ScopeWithin(ALLE) ??

Geschrieben um 13:05 am 24.01.2005 | Zitat | Editieren | Löschen
Kris
Mitglied
Dr Gumby
Beiträge: 181

Ich habe eine Frage zu ScopeWithin:

Bei:



switch (scope_stage) {

1: rfalse;

2: ScopeWithin(AskTopics); rtrue;

...```

Müssen ja alle Topics als Kinder von AskTopics angelegt werden.

Gibt es eine Möglichkeit, ALLE Objekte mit einzubeziehen?

So müsste ein sowieso schon bestehenedes Objekt nicht nocheinmal angelegt werden sondern nur die, die noch nicht als Objekte existieren.

Es muß doch soetwas wie eine "Mutter" aller Objekte geben (gibt es nicht, klar, weil es auch Waisen gibt).

Aber was ich meine, sollen ähnlich wie bei "ObjectLoop (o)" eben alle Objekte berücksichtigt werden.

Der Versuch mit "ScopeWithin()" schlug leider fehl.

Dank und Gruß

Kris
Geschrieben um 13:21 am 24.01.2005 | Zitat | Editieren | Löschen
Martin
Avatar
Mitglied
Prof Gumby
Beiträge: 634

Wieso machst du es nicht so, wie es in Aufgabe 99 beschrieben wird? Du bist ja nicht unbedingt an ScopeWithin gebunden, du kannst ja auch PlaceInScope verwenden:


[ AskTopicsScope i;

  if (scope_stage == 1) rfalse;

  if (scope_stage == 2) {

      objectloop (i ofclass Object) PlaceInScope(i);

      rtrue;

  }

  "Du fragst Sachen!";

];

Probier das mal. Wenn das klappt, könntest du die Objekte, die man erfgaren kann, einschränken, indem du mögliche Objekte mit einem neu zu definierenden Attribut kennzeichnest:


  objectloop (i ofclass Object && i has validtopic)

      PlaceInScope(i);

Das ist vielleicht zuviel des Guten, aber ein großer Scope bedeutet auch viel Arbeit für den Parser, so dass diese Option vielleicht nützlich ist, wenn das Spiel durch den alles umfassenden Scope arg langsam wird.

Vielleicht wird die Analyse aber auch bereits durch den globalen objectloop langsam, dann könntest du vielleicht ein Feld mit gültigen Topics schreiben, die dann dem Scope hinzugefügt werden:


Array validtopics table Napoleon Descartes Jacques_Chirac;

[ AskTopicsScope i;

  if (scope_stage == 1) rfalse;

  if (scope_stage == 2) {

      for (i=1 : i<=validtopics-->0 : i++)

          PlaceInScope(validtopics-->i);

      rtrue;

  }

  "Du fragst Sachen!";

];

Auf diese Weise behalten die Objekte ihren Platz im Baum, können aber trotzdem einigermaßen zügig in den Scope gebracht werden.

Kris:

Der Versuch mit "ScopeWithin()" schlug leider fehl.

Das ist klar. Du versuchst hier, die Kinder von nichts zu finden und das ist laut z-Maschinen-Spezifikation etwas ganz, ganz Böses...

Geschrieben um 16:05 am 24.01.2005 | Zitat | Editieren | Löschen
Kris
Mitglied
Dr Gumby
Beiträge: 181

Martin:

Wieso machst du es nicht so, wie es in Aufgabe 99 beschrieben wird?

Weil ich dummerweise die Aufgaben manchmal überlese obwohl ich dort immer wieder Antworten auf meine Fragen bekommen habe ;-)

Jedenfalls habe ich das eben mal ausprobiert und es funktioniert.

Martin:

Das ist vielleicht zuviel des Guten, aber ein großer Scope bedeutet auch viel Arbeit für den Parser, so dass diese Option vielleicht nützlich ist, wenn das Spiel durch den alles umfassenden Scope arg langsam wird.

Also langsam ist es nicht, ich bin bei ca. 250 Objekten, aber auch noch nicht fertig. Kann aber auch nicht testen, wie lange es auf einem langsameren System dauert, da PentiumII das langsamste ist, was ich zu Hause habe und ich nicht glaube, hier schon einen Unterschied zu bemerken.

Ich werde es jetzt jedenfalls erstmal so belassen.

Vielen Dank!

Kris

Geschrieben um 17:12 am 24.01.2005 | Zitat | Editieren | Löschen
Martin
Avatar
Mitglied
Prof Gumby
Beiträge: 634

Kris:

Weil ich dummerweise die Aufgaben manchmal überlese obwohl ich dort immer wieder Antworten auf meine Fragen bekommen habe ;-)

Die Aufgaben gehören im DM4 auf jeden Fall mit zur Lektüre. Manche Dinge, wenn auch nur selten benutzte, werden nur in Aufgaben angesprochen, wie zum Beispiel in den Aufgaben 65 (lookmode) und 91 (NounDomain). Außerdem sind die Aufgaben sehr gute Beispiele für elegantes Coden in Inform.

PlaceInScope(obj) wird aber auf Seite 234 ohne Zusammenhang zu Aufgaben beschrieben :->

Kris:

Jedenfalls habe ich das eben mal ausprobiert und es funktioniert.

Fein. (Hatte es nämlich nicht getestet.)

AntwortenNeues ThemaNeue Umfrage
Powered by Spam Board SVN © 2007 - 2021
Impressum / Datenschutz