2016-03-04 08:08:47 +03:00
|
|
|
#import <Foundation/Foundation.h>
|
|
|
|
|
|
|
|
#import "types.h"
|
|
|
|
|
|
|
|
NSString * _pr_str(NSObject * obj, BOOL print_readably) {
|
|
|
|
//NSLog(@"class: %@", [obj class]);
|
|
|
|
if ([obj isMemberOfClass:[NSNull class]]) {
|
|
|
|
return @"nil";
|
|
|
|
} else if ([obj isMemberOfClass:[MalTrue class]]) {
|
|
|
|
return @"true";
|
|
|
|
} else if ([obj isMemberOfClass:[MalFalse class]]) {
|
|
|
|
return @"false";
|
|
|
|
} else if ([obj isKindOfClass:[MalSymbol class]]) {
|
|
|
|
return (NSString *) obj;
|
|
|
|
} else if ([obj isKindOfClass:[NSString class]]) {
|
|
|
|
NSString * str = (NSString *)obj;
|
|
|
|
if ([str length] > 0 && ([str hasPrefix:@"\u029e"])) {
|
|
|
|
return [NSString stringWithFormat:@":%@",
|
|
|
|
[str substringWithRange:NSMakeRange(1, [str length]-1)]];
|
|
|
|
} else if (print_readably) {
|
|
|
|
str = [[[(NSString *)obj
|
|
|
|
stringByReplacingOccurrencesOfString:@"\\" withString:@"\\\\"]
|
|
|
|
stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""]
|
|
|
|
stringByReplacingOccurrencesOfString:@"\n" withString:@"\\n"];
|
|
|
|
return [NSString stringWithFormat:@"\"%@\"", str];
|
|
|
|
} else {
|
2016-03-06 10:16:32 +03:00
|
|
|
return [NSString stringWithString:str];
|
2016-03-04 08:08:47 +03:00
|
|
|
}
|
|
|
|
} else if ([obj isKindOfClass:[NSArray class]]) {
|
|
|
|
NSMutableArray * elems = [NSMutableArray array];
|
|
|
|
for (NSObject * elem in (NSArray *)obj) {
|
|
|
|
[elems addObject:_pr_str(elem, print_readably)];
|
|
|
|
}
|
|
|
|
if ([obj isKindOfClass:[MalVector class]]) {
|
|
|
|
return [NSString stringWithFormat:@"[%@]",
|
|
|
|
[elems componentsJoinedByString:@" "]];
|
|
|
|
} else {
|
|
|
|
return [NSString stringWithFormat:@"(%@)",
|
|
|
|
[elems componentsJoinedByString:@" "]];
|
|
|
|
}
|
|
|
|
} else if ([obj isKindOfClass:[NSDictionary class]]) {
|
|
|
|
NSDictionary * dict = (NSDictionary *)obj;
|
|
|
|
NSMutableArray * elems = [NSMutableArray array];
|
|
|
|
for (NSString * key in dict) {
|
|
|
|
[elems addObject:_pr_str(key, print_readably)];
|
|
|
|
[elems addObject:_pr_str(dict[key], print_readably)];
|
|
|
|
}
|
|
|
|
return [NSString stringWithFormat:@"{%@}",
|
|
|
|
[elems componentsJoinedByString:@" "]];
|
|
|
|
} else if (block_Q(obj)) {
|
|
|
|
return @"#<native function>";
|
2016-03-04 10:56:54 +03:00
|
|
|
} else if (atom_Q(obj)) {
|
|
|
|
return [NSString stringWithFormat:@"(atom %@)",
|
|
|
|
_pr_str([(MalAtom *)obj val], print_readably)];
|
2016-03-04 08:08:47 +03:00
|
|
|
} else {
|
|
|
|
return [obj description];
|
|
|
|
}
|
|
|
|
}
|