Ich möchte mehr über die verkettete Programmierung erfahren, indem ich eine kleine einfache Sprache erstelle, die auf dem Stapel basiert und dem verketteten Paradigma folgt.
Leider habe ich nicht viele Ressourcen zu verketteten Sprachen und deren Implementierung gefunden. Entschuldigen Sie mich daher im Voraus für meine mögliche Naivität.
Ich habe meine Sprache daher als eine einfache Folge der Verkettung von Funktionen definiert, die im AST als Liste dargestellt wird:
data Operation
= Concat [Operation]
| Quotation Operation
| Var String
| Lit Literal
| LitOp LiteralOperation
data Literal
= Int Int
| Float Float
data LiteralOperation
= Add | Sub | Mul | Div
Das folgende Programm 4 2 swap dup * +
(entspricht 2 * 2 + 4
), sobald es analysiert wurde, gibt den folgenden AST aus:
Concat [Lit (Int 4), Lit (Int 2), Var "swap", Var "dup", LitOp Mul, LitOp Add]
Jetzt muss ich die Typen ableiten und überprüfen.
Ich habe dieses Typsystem geschrieben:
data Type
= TBasic BasicType -- 'Int' or 'Float'
| TVar String -- Variable type
| TQuoteE String -- Empty stack, noted 'A'
| TQuote String Type -- Non empty stack, noted 'A t'
| TConc Type Type -- A type for the concatenation
| TFun Type Type -- The type of functions
Hier kommt meine Frage ins Spiel, weil ich nicht weiß, welchen Typ ich aus diesem Ausdruck ableiten soll. Der resultierende Typ ist offensichtlich, Int
aber ich weiß nicht, wie ich dieses Programm tatsächlich vollständig auf Typebene überprüfen soll.
Wie Sie oben sehen können, hatte ich am Anfang an einen TConc
Typ gedacht, der die Verkettung genauso darstellt wie der TFun
Typ eine Funktion, da die Verkettungssequenz am Ende eine eindeutige Funktion bildet.
Eine andere Option, die ich noch nicht untersucht habe, wäre, die Inferenzregel der Funktionszusammensetzung auf jedes Element dieser Ausdruckssequenz anzuwenden. Ich weiß nicht, wie es mit dem Stack-basierten funktionieren würde.
Die Frage ist also: Wie machen wir das? Welcher Algorithmus ist zu verwenden und welcher Ansatz auf Typebene sollte bevorzugt werden?