Metodene RuntimeValue.toString og Runtime.showInfo
Disse to metodene skal brukes til ? skrive ut verdier; den f?rste skal brukes n?r programmeren kaller p? print-funksjonen (som skal skrives i del 4) og den andre ved sporing (?tracing?). De vil nesten alltid oppf?fre seg likt; den eneste forskjellen er for string-verdier: de skal ha med anf?rselstegn i Runtine.showInfo men ikke for Runtime.toString.
public String showInfo() { return showInfo(new ArrayList<RuntimeValue>(), false); } @Override public String toString() { return showInfo(new ArrayList<RuntimeValue>(), true); }
Derfor er begge implementert med et kall p? samme metode: showInfo med to parametre. Siste parameter angir om verdien skal brukes til print-funksjonen eller ikke. (F?rste parameter blir forklart litt senere.)
abstract protected String showInfo(ArrayList<RuntimeValue> inUse, boolean toPrint);
N?r dere skal lage nye RuntimeXxxValue-klasser, trenger dere ikke ta hensyn til parameteren inUse. Se for eksempel p? klassen RuntimeBoolValue:
@Override protected String showInfo(ArrayList<RuntimeValue> inUse, boolean toPrint) { return (boolValue ? "True" : "False"); }
eller RuntimeNoneValue:
@Override protected String showInfo(ArrayList<RuntimeValue> inUse, boolean toPrint) { return "None"; }
Dere finner begge to i prekoden.
Bakgrunn (for spesielt interesserte)
Hvorfor benytter referanseinterpreten denne litt kompliserte l?sningen med parameteren inUse? Grunnen er at det er mulig ? lage en rekursiv liste i Asp, for eksempel slik:
a = [ 1, 2 ] a[1] = a
og tilsvarende for ordb?ker. N?r interpreten skal skrive ut en slik liste eller ordbok uten ? sjekke om den er rekursiv, vil interpreten krasje. Det m? vi unng?.
Men, det er alts? kun ved utskrift av lister og ordb?ker vi trenger ? ta hensyn til dette, og som sagt er dette ikke noe som forventes av deres l?sning. Derfor kan dere trygt ignorere parameteren inUse i deres implementasjon.