about summary refs log tree commit diff stats
path: root/apps/mu.subx
diff options
context:
space:
mode:
Diffstat (limited to 'apps/mu.subx')
-rw-r--r--apps/mu.subx47
1 files changed, 47 insertions, 0 deletions
diff --git a/apps/mu.subx b/apps/mu.subx
index b64ac6c2..bb6cd195 100644
--- a/apps/mu.subx
+++ b/apps/mu.subx
@@ -4,6 +4,7 @@
 # To run:
 #   $ ./ntranslate init.linux 0*.subx apps/mu.subx
 
+# A sketch of planned data structures. Still highly speculative.
 == data
 
 # A program is currently a linked list of functions
@@ -21,6 +22,52 @@ Function-next:
 Function-size:
   0x14/imm32/20
 
+# A block is a list of statements:
+#     statements: (address statement)
+
+# A statement can be either a regular statement consisting of:
+#     name: (address string)
+#     inputs: (address var)
+#     outputs: (address var-r)
+# or a variable declaration on the stack:
+#     name: (address string)
+#     type: (address type-sexpr)
+# or a regular statement writing to a single new variable in a register:
+#     name: (address string)
+#     inputs: (address var)
+#     output: var-r
+# or a block of statements:
+#     statements: (address statement)
+
+# Kinds of local variable declarations:
+#   var f : (array foo 10)
+#   var f/ecx : int <- copy 0
+# Variables live in either the stack or a register.
+# Variables in the stack are auto-initialized.
+#   (This is non-trivial for arrays, and arrays inside structs... We'll see.)
+# Variables in register need a real instruction.
+
+# var is a variable declaration. e.g. `foo: (array int 3)`
+#   name: (address string)
+#   type: (address type-sexpr)
+
+# var-r is a variable declaration in a register. e.g. `foo/eax: (array int 3)`
+#   name: (address string)
+#   type: (address type-sexpr)
+#   reg: int [0..7]
+
+# type-sexpr is a tree of type identifiers. e.g. (array (address int) 3)
+# either
+#   id: type-identifier
+# or
+#   car: (address type-sexpr)
+#   cdr: (address type-sexpr)
+
+# Still todo:
+#   heap allocations (planned name: 'handle')
+#   user-defined types: 'type' for structs, 'choice' for unions
+#   short-lived 'address' type for efficiently writing inside nested structs
+
 == code
 
 Entry:
n172' href='#n172'>172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207