summaryrefslogtreecommitdiff
path: root/MLKLexicalContext.m
diff options
context:
space:
mode:
authorMatthias Andreas Benkard <matthias@benkard.de>2008-06-27 23:53:25 +0200
committerMatthias Andreas Benkard <matthias@benkard.de>2008-06-27 23:53:25 +0200
commit05fc2a9fd9326bd059681b7684a74e1ad1de1ec6 (patch)
treed01fa6dbe3881f44ea6145cf79c007b12b585c8d /MLKLexicalContext.m
parent7ad928e57d7ed8818040327a31b7dad5ec04ec10 (diff)
MLKInterpreter: Fix macro support.
Diffstat (limited to 'MLKLexicalContext.m')
-rw-r--r--MLKLexicalContext.m25
1 files changed, 17 insertions, 8 deletions
diff --git a/MLKLexicalContext.m b/MLKLexicalContext.m
index 32c1bf2..7f7e395 100644
--- a/MLKLexicalContext.m
+++ b/MLKLexicalContext.m
@@ -44,7 +44,9 @@
? (id) parent_member \
: nil) \
values:variable] \
- : (id) (parent ? (id) RETAIN (parent_member) : nil));
+ : (id) (parent \
+ ? (id) RETAIN (parent_member) \
+ : [[MLKEnvironment alloc] init]));
static MLKLexicalContext *global_context;
@@ -92,10 +94,10 @@ static MLKSymbol *LEXICAL;
_goTags = MAKE_ENVIRONMENT (goTags, _parent, _parent->_goTags);
_macros = MAKE_ENVIRONMENT (macros, _parent, _parent->_macros);
- _symbolMacros = MAKE_ENVIRONMENT (macros, _parent, _parent->_symbolMacros);
+ _symbolMacros = MAKE_ENVIRONMENT (symbolMacros, _parent, _parent->_symbolMacros);
- ASSIGN (_knownMacros, [macros allKeys]);
- ASSIGN (_knownSymbolMacros, [symbolMacros allKeys]);
+ ASSIGN (_knownMacros, [NSMutableSet setWithArray:[macros allKeys]]);
+ ASSIGN (_knownSymbolMacros, [NSMutableSet setWithArray:[symbolMacros allKeys]]);
ASSIGN (_declarations, declarations);
return self;
@@ -124,26 +126,33 @@ static MLKSymbol *LEXICAL;
return global_context;
}
--(id) macroForSymbol:(MLKSymbol *)symbol
+-(id <MLKFuncallable>) macroForSymbol:(MLKSymbol *)symbol
{
return [_macros valueForSymbol:symbol];
}
-(void) addMacro:(id <MLKFuncallable>)value forSymbol:(MLKSymbol *)symbol
{
- [_symbolMacros addValue:value forSymbol:symbol];
+ [_knownMacros addObject:symbol];
+ [_macros addValue:value forSymbol:symbol];
}
-(void) setMacro:(id <MLKFuncallable>)value forSymbol:(MLKSymbol *)symbol
{
- [_symbolMacros setValue:value forSymbol:symbol];
+ [_macros setValue:value forSymbol:symbol];
}
--(id) symbolMacroForSymbol:(MLKSymbol *)symbol
+-(id <MLKFuncallable>) symbolMacroForSymbol:(MLKSymbol *)symbol
{
return [_symbolMacros valueForSymbol:symbol];
}
+-(void) addSymbolMacro:(id <MLKFuncallable>)value forSymbol:(MLKSymbol *)symbol
+{
+ [_knownSymbolMacros addObject:symbol];
+ [_symbolMacros addValue:value forSymbol:symbol];
+}
+
-(void) setSymbolMacro:(id <MLKFuncallable>)value forSymbol:(MLKSymbol *)symbol
{
[_symbolMacros setValue:value forSymbol:symbol];