diff modules/symbols.tp @ 302:aea99b93cf2f

More fleshed out implementation of symbol tables
author Michael Pavone <pavone@retrodev.com>
date Fri, 25 Jul 2014 13:46:43 -0700
parents 98147071baf6
children
line wrap: on
line diff
--- a/modules/symbols.tp	Fri Jul 25 13:43:36 2014 -0700
+++ b/modules/symbols.tp	Fri Jul 25 13:46:43 2014 -0700
@@ -3,6 +3,9 @@
 		find:else <- :_ :else {
 			else:
 		}
+		ifDefined:else <- :name ifdef :else {
+			else:
+		}
 	}
 	_local <- 0
 	_closedover <- 1
@@ -19,17 +22,63 @@
 			name <- { _name }
 			id <- { _id }
 			string <- { "method " . _name . "(" . _id . ")" }
+			isMethod? <- { true }
+			isLocal? <- { false }
+		}
+	}
+	_local <- :_name _def {
+		#{
+			name <- { _name }
+			string <- { "local " . _name }
+			def <- { _def }
+			isMethod? <- { false }
+			closedOver? <- false
+			isLocal? <- { true }
+		}
+	}
+	_upvar <- :parent {
+		if: (parent isLocal?) {
+			parent closedOver?!: true
+			#{
+				name <- { parent name }
+				def <- { parent def }
+				closedOver? <- { parent closedOver? }
+				isMethod? <- { parent isMethod? }
+				string <- { "upvar " . name}
+				isLocal? <- { false }
+				depth <- 1
+			}
+		} else: {
+			parent depth!: (parent depth) + 1
 		}
 	}
 	#{
 		nullTable <- { _null }
 
-		tablewithParent <- :_parent {
+		tableWithParent <- :_parent {
 			_symbols <- dict hash
 			#{
+				ifDefined:else <- :name ifdef :else {
+					_symbols ifget: name :sym {
+						ifdef: sym
+					} else: {
+						_parent ifDefined: name :sym {
+							ifdef: (_upvar: sym)
+						} else: else
+					}
+				}
 				find:else <- :name :else {
 					_symbols get: name else: {
-						_parent find: name else: else
+						_parent ifDefined: name :sym {
+							if: (sym isMethod?) {
+								//TODO: methods on parent objects
+								sym
+							} else: {
+								_upvar: sym
+							}
+						} else: {
+							else:
+						}
 					}
 				}
 				defineMethod <- :name {
@@ -38,6 +87,16 @@
 					}
 					self
 				}
+				define <- :name def {
+					s <- (_local: name def)
+					_symbols set: name s
+					s
+				}
+				find:elseDefine <- :name :def {
+					find: name else: {
+						define: name def
+					}
+				}
 				print <- {
 					foreach: _symbols :name info {
 						print: name . ": " . info . "\n"
@@ -47,7 +106,7 @@
 		}
 
 		table <- {
-			tablewithParent: _null
+			tableWithParent: _null
 		}
 
 		buildMethodTable <- :tree {