2010-05-28 12 views
11

Ich versuche, meinen eigenen Operator in Io zu definieren, und ich habe eine harte Zeit. Ich habe ein Objekt:Wie definiere ich meine eigenen Operatoren in der Programmiersprache Io?

MyObject := Object clone do(
    lst := list() 
    !! := method(n, lst at(n)) 
) 

Aber wenn ich es nennen, wie folgt aus:

x := MyObject clone do(lst appendSeq(list(1, 2, 3))) 
x !! 2 

Aber ich erhalte eine Ausnahme dieses Argument 0 bis bei darf nicht Null sein. Wie kann ich reparieren?

Antwort

14

Nun, es gibt ein Problem in Ihrem Code. Einfach gesagt, Sie haben nicht hinzugefügt! zum Operatortisch. Ich gebe dir ein wenig Hintergrundwissen dazu.

Operatoren in Io werden gemischt, bevor der AST erstellt wird. Das bedeutet, dass wir eine Liste bekannter Operatoren mit bestimmten Prioritätsstufen pflegen müssen, um zu wissen, welche diejenigen enger binden als andere. Wir machen das in der "OperatorTable". Wenn Sie sich in der REPL befinden, können Sie sehen, wie Sie sie verwenden, indem Sie "OperatorTable" in die REPL (ohne die Anführungszeichen) eingeben. Dadurch erhalten Sie eine Liste der Operatoren (dynamisch generiert, sodass neue Operatoren hinzugefügt werden, sobald sie definiert sind) sowie Beispiele für die Verwendung der einzelnen Operatoren. Es gibt zwei Arten:

  1. Binäre Operatoren (1 + 2 zum Beispiel, genannt einfach "Betreiber")
  2. Zuweisungsoperator (a: = b zum Beispiel)

So in Ihrem Beispiel, Dein Code ist richtig. da müssen wir nichts ändern. Allerdings fehlt uns ein Bit Code, damit das Parsing-Subsystem weiß, wie es mit Ihrem Operator umgeht. Ich gebe ein Beispiel, das davon ausgeht, dass Sie so eng wie Multiplikation binden wollen.

OperatorTable addOperator("!!", 3) 

Jetzt können wir sehen, wie dies durch den Aufbau eine Nachricht und schaut, wie sein Baum dargestellt wird, gemischt wird. wenn wir wieder in der REPL, Typ:

message(a !! b) 

Wir so etwas wie dies sehen:

==> a !!(b) 

Dies ist genau wie jede andere Methode aufrufen, muss es irgendwo existieren sonst werden Sie eine bekommen Error. Sie können es verwenden, wie oben gezeigt (mit expliziten Klammern), oder Sie können es wie gewünscht in Ihrer ursprünglichen Frage verwenden, ohne explizite Klammern. Wie bei jedem Operator unterliegen Sie den Vorrangregeln, wenn Sie keine expliziten Klammern verwenden, nur damit Sie sich dessen bewusst sind.

Hoffe das beantwortet Ihre Frage.

+1

Vielen Dank für Ihre Antwort, hilfreich zu wissen. Allerdings verstehe ich nicht, warum "n" in meinem !! Methode. –

+3

In Ordnung, einfach gesagt, in Io, nur CFunctions (dh Methoden, die in C-Code implementiert sind, die bestimmte Argumente bei bestimmten Indizes abrufen) haben die Voraussetzung, dass Sie mindestens N Argumente liefern müssen. Wenn ein Operator nicht bekannt ist, wird er nicht gemischt, was bedeutet, dass Ihr Original x ist !! 2 wurde gesehen als: Nachricht (x !! 2) und nicht Nachricht (x !! (2)). Schon seit !! ist in Io-Code mit Standard-Argument-Behandlung definiert, was passiert ist, dass alle nicht explizit angegebenen Argumente mit "Nil" ausgefüllt werden. Das heißt, die Argumente werden definiert, aber sie zeigen auf Null. Dies ist die Ursache Ihres Problems. – jer

+0

+1 für eine gründliche Antwort, auch für den Leckerbissen über die OperatorTable Darstellung der Rangfolge. Das hatte ich nicht bemerkt. – labyrinth

Verwandte Themen