Operator in Io überschreiben: Unterschiede bei REPL und Interpreter (erledigt)

Mat

Aktives Mitglied
Hat sich erledigt, während ich das hier geschrieben hab. Mir ist aufgefallen, dass ich Klammern vergessen hatte und er deswegen immer println an den rechten Operanden geschickt hat, statt an das Ergebnis. Außerdem gab es noch ein kleines Problemchen damit, dass man eine Datei anscheinend nicht main.io nennen sollte, wenn man nicht möchte, dass sie automatisch beim Aufruf von io ausgeführt wird. Das läuft jetzt alles. Aber vielleicht ist es ja von Interesse für irgendwen. :D

Fazit: Ausführungskontext ist wichtig, Ladereihenfolge ist wichtig, Klammern sind wichtig, Dateinamen sind wichtig, unwichtige Dinge sind wichtig.
------------------

Vielleicht hat ja jemand von euch Erfahrung mit der etwas obskuren Sprache Io . Ist eigentlich ganz lustig mit Prototypen und Nachrichtenpipelines, aber ich komme noch nicht so ganz damit klar.

Ich versuche, einen Operator zu überschreiben, aber da kommen unterschiedliche Dinge raus, abhängig davon ob ich im interaktiven Terminal bin oder der Interpreter eine Datei lädt.

Das hier geht im interaktiven Terminal ohne Probleme:
Ruby:
OperatorTable addOperator("div", 2)
Number div := (Number getSlot("/")) clone
Number / := method(other, if(other == 0, 0, self div other))
5/0 # => 0
5/2 # => 2.5

Über den Interpreter hingegen kommt er mit Fehlern, weil er versucht, auf den div-Slot zuzugreifen, während der noch nicht fertig definiert ist. Vonwegen div würde nil übergeben bekommen usw, noch bevor er meinen Code ausführt.

Habe das so weit nachverfolgen können, dass er wohl während der Ausführung versucht, das Padding für Text zu berechnen. Dabei ist anscheinend Division im Spiel, aber die ist ja in dem Moment nur halb fertig.

Ich habe es jetzt immerhin hinbekommen, dass er die Aktionen in der richtigen Reihenfolge nacheinander lädt, so wie es im REPL-Terminal ablaufen würde. Allerdings spuckt er die falschen Zahlen aus:

Edit: schon die "reparierte" Version
Ruby:
"Loading app.io..." println

(0/5) println # => 0
(5/0) println # => 1.#INF00e+000
(50/2) println # => 25
(5/2) println # => 2.5

doFile("operators.io")
doFile("overrides.io")

# Falsch
50/2 println # => 2
5/2 println # => 2

# Richtig
(0/5) println # => 0
(5/0) println # => 0
(50/2) println # => 25
(5/2) println # => 2.5


operators.io:
"Loading operators.io..." println

OperatorTable addOperator("div", 2)

overrides.io:
"Loading overrides.io..." println

Number div := (Number getSlot("/")) clone
Number / := method(other, if(other == 0, 0, self div other))
 
Zuletzt bearbeitet:
Zurück
Oben Unten