comparison 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
comparison
equal deleted inserted replaced
301:5d24b3117aa7 302:aea99b93cf2f
1 { 1 {
2 _null <- #{ 2 _null <- #{
3 find:else <- :_ :else { 3 find:else <- :_ :else {
4 else:
5 }
6 ifDefined:else <- :name ifdef :else {
4 else: 7 else:
5 } 8 }
6 } 9 }
7 _local <- 0 10 _local <- 0
8 _closedover <- 1 11 _closedover <- 1
17 _nextMethodId <- _id + 1 20 _nextMethodId <- _id + 1
18 #{ 21 #{
19 name <- { _name } 22 name <- { _name }
20 id <- { _id } 23 id <- { _id }
21 string <- { "method " . _name . "(" . _id . ")" } 24 string <- { "method " . _name . "(" . _id . ")" }
25 isMethod? <- { true }
26 isLocal? <- { false }
27 }
28 }
29 _local <- :_name _def {
30 #{
31 name <- { _name }
32 string <- { "local " . _name }
33 def <- { _def }
34 isMethod? <- { false }
35 closedOver? <- false
36 isLocal? <- { true }
37 }
38 }
39 _upvar <- :parent {
40 if: (parent isLocal?) {
41 parent closedOver?!: true
42 #{
43 name <- { parent name }
44 def <- { parent def }
45 closedOver? <- { parent closedOver? }
46 isMethod? <- { parent isMethod? }
47 string <- { "upvar " . name}
48 isLocal? <- { false }
49 depth <- 1
50 }
51 } else: {
52 parent depth!: (parent depth) + 1
22 } 53 }
23 } 54 }
24 #{ 55 #{
25 nullTable <- { _null } 56 nullTable <- { _null }
26 57
27 tablewithParent <- :_parent { 58 tableWithParent <- :_parent {
28 _symbols <- dict hash 59 _symbols <- dict hash
29 #{ 60 #{
61 ifDefined:else <- :name ifdef :else {
62 _symbols ifget: name :sym {
63 ifdef: sym
64 } else: {
65 _parent ifDefined: name :sym {
66 ifdef: (_upvar: sym)
67 } else: else
68 }
69 }
30 find:else <- :name :else { 70 find:else <- :name :else {
31 _symbols get: name else: { 71 _symbols get: name else: {
32 _parent find: name else: else 72 _parent ifDefined: name :sym {
73 if: (sym isMethod?) {
74 //TODO: methods on parent objects
75 sym
76 } else: {
77 _upvar: sym
78 }
79 } else: {
80 else:
81 }
33 } 82 }
34 } 83 }
35 defineMethod <- :name { 84 defineMethod <- :name {
36 _symbols get: name else: { 85 _symbols get: name else: {
37 _symbols set: name (_method: name) 86 _symbols set: name (_method: name)
38 } 87 }
39 self 88 self
89 }
90 define <- :name def {
91 s <- (_local: name def)
92 _symbols set: name s
93 s
94 }
95 find:elseDefine <- :name :def {
96 find: name else: {
97 define: name def
98 }
40 } 99 }
41 print <- { 100 print <- {
42 foreach: _symbols :name info { 101 foreach: _symbols :name info {
43 print: name . ": " . info . "\n" 102 print: name . ": " . info . "\n"
44 } 103 }
45 } 104 }
46 } 105 }
47 } 106 }
48 107
49 table <- { 108 table <- {
50 tablewithParent: _null 109 tableWithParent: _null
51 } 110 }
52 111
53 buildMethodTable <- :tree { 112 buildMethodTable <- :tree {
54 _object <- ast obj 113 _object <- ast obj
55 _assignment <- ast assignment 114 _assignment <- ast assignment