Seite 1 von 1

Aufgabe 1 - Berechnete Konstanten

Verfasst: 17. Jun 2010 12:59
von Edoat
Aufgabenblatt 1, 2.3 Änderungen der Eingabesprache hat geschrieben:Konstanten dürfen nicht mehr von Variablen abhängen
Ich hatte den Satz so interpretiert, dass Konstanten von Funktionen (sowohl selbstdefinierten als auch intrinsischen wie chr() und ord()) abhängen dürfen, falls alle Parameter konstant sind bzw. selber nur aus Konstanten berechnet werden. Wie verhält es sich mit berechneten Konstanten (wie z.B. y auf Folie 51 im codegen-handout)? Sind im Kontext von berechneten Konstanten var-Parameter und konstante Parameter in Prozeduren jeweils als konstant anzusehen?

Re: Aufgabe 1 - Berechnete Konstanten

Verfasst: 17. Jun 2010 18:13
von tzeenie
Edoat hat geschrieben:Sind im Kontext von berechneten Konstanten var-Parameter und konstante Parameter in Prozeduren jeweils als konstant anzusehen?
Was meinst Du mit var-Parametern "im Kontext von berechneten Konstanten"? Konstanten werden über Expressions definiert - d.h. es gibt keine var-Parameter, da hier höchstens ein Funktionsaufruf stattfinden kann (CallExpression). Funktionen sind selbst ebenfalls wieder Expressions und können keine Zuweisungen ausführen (in "unserem" Triangle). Oder hab ich da was falsch verstanden? :?

Re: Aufgabe 1 - Berechnete Konstanten

Verfasst: 17. Jun 2010 19:58
von Tobias
Aufgabenblatt hat geschrieben:Konstanten dürfen nicht mehr von Variablen abhängen
Diese Einschränkung ergibt sich aus dem Verbot verschachtelter let-Blöcke und nichtlokaler Variablen. Diese zwei Verbote haben nämlich zur Folge, dass es keine Möglichkeit mehr gibt, vor einer Konstantendeklaration die verwendeten Variablen zu initialisieren. Dementsprechend wären solche Konstanten stets undefiniert. Bei Parametern gibt es dieses Problem nicht, da diese bereits vor dem Funktions- oder Prozeduraufruf ihren Wert erhalten.

Man kann jetzt natürlich noch darüber diskutieren, was nach der Aufgabenstellung als Variable gilt. Man könnte einerseits argumentieren, dass das oben genannte Problem auf Parameter nicht zutrifft und daher nur "echte" Variablen (also Verweise auf VarDeclaration-Knoten) ausgeschlossen werden müssen.
Andererseits könnte man argumentieren, dass das Verbot nichtlokaler Variablen auch nichtlokale Parameter einschließt und analog dazu Konstanten auch nicht von Parametern abhängen dürfen. Das hätte außerdem noch den Nebeneffekt, dass Konstanten bei jedem Programmablauf denselben Wert haben und zur Kompilierzeit berechenbar sind.

Wie auch immer: Mir ist eigentlich egal, für welche Möglichkeit ihr euch entscheidet. Die Aufgabenstellung ist da nicht eindeutig und ich denke, es gibt wichtigere Probleme. ;) Im Zweifelsfall sprecht nochmal Florian Stock darauf an.

Re: Aufgabe 1 - Berechnete Konstanten

Verfasst: 17. Jun 2010 21:28
von Edoat
Tobias hat geschrieben:Wie auch immer: Mir ist eigentlich egal, für welche Möglichkeit ihr euch entscheidet. Die Aufgabenstellung ist da nicht eindeutig und ich denke, es gibt wichtigere Probleme. ;)
Ok, vielen Dank.
tzeenie hat geschrieben:Was meinst Du mit var-Parametern "im Kontext von berechneten Konstanten"?
Falls es durch Tobias Antwort noch nicht klar geworden sein sollte, ich meinte sowas wie die Konstante aplus1 in folgendem konstruiertem Beispiel:

Code: Alles auswählen

proc inc(var a : Integer) ~
let
  const aplus1 ~ a * a
in begin
  a := aplus1
end
Die Konstante c hängt hier von a ab. Obwohl a ein var-Parameter ist, wird der Wert aplus1 zur Laufzeit berechnet und ist dann konstant.