changeset 39:0e1fc2b2832f

Add support for import:from to lmc
author Michael Pavone <pavone@retrodev.com>
date Sat, 26 Jul 2014 15:25:41 -0700
parents 6b9b21456cf4
children d5ccb66ae98b
files code/lmc.tp
diffstat 1 files changed, 59 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/code/lmc.tp	Sat Jul 26 13:44:45 2014 -0700
+++ b/code/lmc.tp	Sat Jul 26 15:25:41 2014 -0700
@@ -310,32 +310,74 @@
 				outer <- res yield
 				functions <- dict hash
 				
-				num <- (outer messages) length
+				num <- 0
 				syms <- symbols table
 				
-				prog add: (inst: "DUM" #[num])
+				dumaddr <- prog pc
+				prog add: (inst: "DUM" #[0])
+				
 				slot <- 0
 				mainArgs <- 0
-				foreach: (outer messages) :idx msg {
-					if: (msg nodeType) = (ast assignment) {
-						def <- msg assign
-						sym <- (msg to) name
-						
-						if: (def nodeType) = (ast lambda) {
-							prog add: (inst: "LDF" #[sym])
-							functions set: sym def
-							if: sym = "main" {
-								mainArgs <- (def args) length
+				messageGroups <- [(outer messages)]
+				while: { not: (messageGroups empty?) } do: {
+					curMessages <- messageGroups value
+					messageGroups <- messageGroups tail
+					foreach: curMessages :idx msg {
+						if: (msg nodeType) = (ast assignment) {
+							num <- num + 1
+							def <- msg assign
+							sym <- (msg to) name
+							
+							if: (def nodeType) = (ast lambda) {
+								prog add: (inst: "LDF" #[sym])
+								functions set: sym def
+								if: sym = "main" {
+									mainArgs <- (def args) length
+								}
+							} else: {
+								compileExpr: def syms: syms
 							}
+							syms define: sym slot
+							slot <- slot + 1
 						} else: {
-							compileExpr: def syms: syms
+							if: (msg nodeType) = (ast call) && ((msg tocall) nodeType) = (ast sym) && (
+									((msg tocall) name) = "import:from"
+							) {
+								importSyms <- (((msg args) value) els) fold: (dict hash) with: :acc sym {
+									acc set: (sym name) true
+								}
+								moduleName <- ((((msg args) tail) value) args) value
+								moduleFile <- if: (moduleName nodeType) = (ast sym) {
+									(moduleName name) . ".lm"
+								} else: {
+									if: ((moduleName val) endsWith?: ".lm") {
+										moduleName val
+									} else: {
+										(moduleName val) . ".lm"
+									}
+								}
+								f <- file open: moduleFile
+								moduleRes <- parser top: (f readAll)
+								if: moduleRes {
+									newGroup <- []
+									foreach: ((moduleRes yield) messages) :idx msg {
+										if: (msg nodeType) = (ast assignment) {
+											importSyms ifget: ((msg to) name) :jnk {
+												newGroup <- msg | newGroup
+											} else: {}
+										}
+									}
+									messageGroups <- newGroup | messageGroups
+								} else: {
+									error: "Failed to parse module " . moduleFile . "!\n"
+								}
+							} else: {
+								error: "Only assignments and import:from are allowed at the top level"
+							}
 						}
-						syms define: sym slot
-						slot <- slot + 1
-					} else: {
-						error: "Only assignments are allowed at the top level"
 					}
 				}
+				(((prog instructions) get: dumaddr) args) set: 0 num
 				after_env <- prog makeLabel: "after_env"
 				prog add: (inst: "LDF" #[after_env])
 				prog add: (inst: "TRAP" #[num])