Saya ingin belajar lebih banyak tentang pemrograman concatenative melalui pembuatan bahasa kecil yang sederhana, berdasarkan stack dan mengikuti paradigma concatenative.
Sayangnya, saya belum menemukan banyak sumber daya mengenai bahasa konkatatif dan implementasinya, jadi maafkan saya sebelumnya untuk kemungkinan kenaifan saya.
Karena itu saya mendefinisikan bahasa saya sebagai urutan sederhana rangkaian fungsi, yang diwakili dalam AST sebagai daftar:
data Operation
= Concat [Operation]
| Quotation Operation
| Var String
| Lit Literal
| LitOp LiteralOperation
data Literal
= Int Int
| Float Float
data LiteralOperation
= Add | Sub | Mul | Div
Program berikut, 4 2 swap dup * +
(sesuai dengan 2 * 2 + 4
) setelah diuraikan, akan memberikan AST berikut:
Concat [Lit (Int 4), Lit (Int 2), Var "swap", Var "dup", LitOp Mul, LitOp Add]
Sekarang saya harus menyimpulkan dan memeriksa tipenya.
Saya menulis sistem jenis ini:
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
Di situlah pertanyaan saya masuk, karena saya tidak tahu tipe apa yang dapat disimpulkan dari ungkapan itu. Jenis yang dihasilkan jelas, Int
tapi saya tidak tahu bagaimana sebenarnya memeriksa program ini pada tingkat jenis.
Pada awalnya, seperti yang dapat Anda lihat di atas, saya telah memikirkan TConc
jenis yang mewakili penggabungan dengan cara yang sama seperti TFun
jenis mewakili fungsi, karena pada akhirnya urutan rangkaian membentuk fungsi yang unik.
Pilihan lain, yang belum saya eksplorasi, adalah menerapkan aturan inferensi komposisi fungsi untuk setiap elemen dari urutan ekspresi ini. Saya tidak tahu bagaimana cara kerjanya dengan stack-based.
Pertanyaannya adalah: bagaimana kita melakukannya? Algoritme mana yang digunakan, dan pendekatan mana pada level tipe yang harus dipilih?