1 package gnu.kawa.lispexpr; 2 import gnu.mapping.*; 3 import gnu.lists.*; 4 5 7 8 public class LispPackage extends Namespace 9 { 10 13 Namespace exported; 14 15 LList shadowingSymbols = LList.Empty; 16 17 21 NamespaceUse imported; 22 24 NamespaceUse importing; 25 26 40 41 public Symbol lookup(String name, int hash, boolean create) 42 { 43 Symbol sym = exported.lookup(name, hash, false); 44 if (sym != null) 45 return sym; 46 sym = lookupInternal(name, hash); 47 if (sym != null) 48 return sym; 49 50 for (NamespaceUse used = imported; used != null; 52 used = used.nextImported) 53 { 54 sym = lookup(name, hash, false); 55 if (sym != null) 56 return sym; 57 } 58 59 if (create) 60 return add(new Symbol(this, name), hash); 61 else 62 return null; 63 } 64 65 public Symbol lookupPresent (String name, int hash, boolean intern) 66 { 67 Symbol sym = exported.lookup(name, hash, false); 68 if (sym == null) 69 sym = super.lookup(name, hash, intern); 70 return sym; 71 } 72 73 public boolean isPresent (String name) 74 { 75 return lookupPresent(name, name.hashCode(), false) != null; 76 } 77 78 public boolean unintern (Symbol symbol) 79 { 80 String name = symbol.getName(); 81 int hash = name.hashCode(); 82 if (exported.lookup(name, hash, false) == symbol) 83 exported.remove(symbol); 84 else if (super.lookup(name, hash, false) == symbol) 85 super.remove(symbol); 86 else 87 return false; 88 symbol.setNamespace(null); 89 if (removeFromShadowingSymbols(symbol)) 90 { 91 } 94 return true; 95 } 96 97 private void addToShadowingSymbols (Symbol sym) 98 { 99 for (Object s = shadowingSymbols; s != LList.Empty; ) 100 { 101 Pair p = (Pair) s; 102 if (p.car == sym) 103 return; 104 s = p.cdr; 105 } 106 shadowingSymbols = new Pair(sym, shadowingSymbols); 107 } 108 109 private boolean removeFromShadowingSymbols (Symbol sym) 110 { 111 Pair prev = null; 112 for (Object s = shadowingSymbols; s != LList.Empty; ) 113 { 114 Pair p = (Pair) s; 115 s = p.cdr; 116 if (p.car == sym) 117 { 118 if (prev == null) 119 shadowingSymbols = (LList) s; 120 else 121 prev.cdr = s; 122 return true; 123 } 124 prev = p; 125 } 126 return false; 127 } 128 129 130 public void shadow (String name) 131 { 132 Symbol sym = lookupPresent(name, name.hashCode(), true); 133 addToShadowingSymbols(sym); 134 } 135 136 public void shadowingImport (Symbol symbol) 137 { 138 String name = symbol.getName(); 139 int hash = name.hashCode(); 140 Symbol old = lookupPresent(name, name.hashCode(), false); 141 if (old != null && old != symbol) 142 unintern(old); 143 addToShadowingSymbols(symbol); 144 } 145 146 } 147 148 149 151 class NamespaceUse 152 { 153 Namespace imported; 154 NamespaceUse nextImported; 155 156 Namespace importing; 157 NamespaceUse nextImporting; 158 } 159 | Popular Tags |