diff options
author | Matthias Andreas Benkard <matthias@benkard.de> | 2008-06-16 14:36:53 +0200 |
---|---|---|
committer | Matthias Andreas Benkard <matthias@benkard.de> | 2008-06-16 14:36:53 +0200 |
commit | 6faaa45e37a758ff1e662d1d987df6a5ce2cbd2a (patch) | |
tree | a90747f619ab519f2e5c42ee86811cb48690b75e /MLKParenReader.m | |
parent | 382f1be127ada9e777cae9c230254040b508f607 (diff) |
Add class MLKParenReader.
Diffstat (limited to 'MLKParenReader.m')
-rw-r--r-- | MLKParenReader.m | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/MLKParenReader.m b/MLKParenReader.m new file mode 100644 index 0000000..f50cf68 --- /dev/null +++ b/MLKParenReader.m @@ -0,0 +1,84 @@ +/* -*- mode: objc; coding: utf-8 -*- */ +/* Étoilisp/Mulklisp, a Common Lisp subset for the Étoilé runtime. + * Copyright (C) 2008 Matthias Andreas Benkard. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#import "MLKParenReader.h" + +#import "MLKCharacter.h" +#import "MLKCons.h" +#import "MLKDynamicContext.h" +#import "MLKReader.h" +#import "MLKReadtable.h" +#import "MLKPackage.h" +#import "MLKStream.h" + +#import <Foundation/NSArray.h> + + +static unichar slurpWhitespaceAndPeek (MLKStream *stream, MLKReadtable *readtable) +{ + unichar ch; + while ([readtable isWhitespaceCharacter:(ch = [stream readChar])]); + [stream unreadChar:ch]; + return ch; +} + + +@implementation MLKParenReader +-(NSArray *) applyToArray:(NSArray *)arguments +{ + MLKStream *stream; + unichar ch; + MLKReadtable *readtable; + MLKCons *cons, *tail; + unichar nextChar; + + stream = [arguments objectAtIndex:0]; + ch = [[arguments objectAtIndex:1] unicharValue]; + readtable = [[MLKDynamicContext currentContext] + valueForBinding:[[MLKPackage findPackage:@"COMMON-LISP"] + intern:@"*READTABLE*"]]; + cons = nil; + tail = nil; + + nextChar = slurpWhitespaceAndPeek(stream, readtable); + while (nextChar != ')') + { + id item; + + // FIXME: What to do about dots? Maybe add a new + // singleDotAllowed:(BOOL)dotp argument to readFromStream:...? + item = [MLKReader readFromStream:stream + eofError:YES + eofValue:nil + recursive:YES + preserveWhitespace:NO]; + + if (!tail) + { + cons = tail = [MLKCons cons:item with:nil]; + } + else + { + [tail setCdr:[MLKCons cons:item with:nil]]; + tail = [tail cdr]; + } + } + + return [NSArray arrayWithObject:cons]; +} +@end |