diff options
author | Matthias Andreas Benkard <matthias@benkard.de> | 2008-07-03 20:17:10 +0200 |
---|---|---|
committer | Matthias Andreas Benkard <matthias@benkard.de> | 2008-07-03 20:17:10 +0200 |
commit | 475dd63b41774c96289df54c7987de95faa55099 (patch) | |
tree | 40f99273fbc0c4ca431ce6dfc875a510a4505d4f | |
parent | 107dee15d5422f327ce55625a0a321b98693394e (diff) |
Implement MACROEXPAND-1.
-rw-r--r-- | MLKPackage.m | 1 | ||||
-rw-r--r-- | MLKRoot.m | 18 |
2 files changed, 19 insertions, 0 deletions
diff --git a/MLKPackage.m b/MLKPackage.m index 4673f0e..bb6e2db 100644 --- a/MLKPackage.m +++ b/MLKPackage.m @@ -99,6 +99,7 @@ static NSMutableDictionary *packages = nil; [sys export:[sys intern:@"MULTIPLY"]]; [sys export:[sys intern:@"DIVIDE"]]; [sys export:[sys intern:@"LIST"]]; + [sys export:[sys intern:@"MACROEXPAND-1"]]; [tlUser usePackage:clUser]; } @@ -209,4 +209,22 @@ static id truify (BOOL value) { RETURN_VALUE ([MLKCons listWithArray:args]); } + ++(NSArray *) macroexpand_1:(NSArray *)args +{ + id form = [args objectAtIndex:0]; + id env = [args count] > 1 ? [args objectAtIndex:1] : nil; + MLKLexicalContext *context = env ? (id)env : (id)[MLKLexicalContext globalContext]; + + if ([context symbolNamesMacro:[form car]]) + { + id <MLKFuncallable> macrofun = [context macroForSymbol:[form car]]; + form = denullify ([[macrofun applyToArray: + [NSArray arrayWithObjects: + form, context, nil]] + objectAtIndex:0]); + } + + RETURN_VALUE (form); +} @end |