1 #import
<Foundation
/Foundation.h
>
5 NSString
* _pr_str
(NSObject
* obj
, BOOL print_readably
) {
6 //NSLog
(@"
class: %@", [obj class]);
7 if ([obj isMemberOfClass
:[NSNull
class]]) {
9 } else if ([obj isMemberOfClass
:[MalTrue
class]]) {
11 } else if ([obj isMemberOfClass
:[MalFalse
class]]) {
13 } else if ([obj isKindOfClass
:[MalSymbol
class]]) {
14 return (NSString
*) obj
;
15 } else if ([obj isKindOfClass
:[NSString
class]]) {
16 NSString
* str
= (NSString
*)obj
;
17 if ([str
length] > 0 && ([str hasPrefix
:@"
\u029e"
])) {
18 return [NSString stringWithFormat
:@"
:%@",
19 [str substringWithRange
:NSMakeRange
(1, [str
length]-1)]];
20 } else if (print_readably
) {
21 str
= [[[(NSString
*)obj
22 stringByReplacingOccurrencesOfString
:@"
\\" withString
:@"
\\\\"
]
23 stringByReplacingOccurrencesOfString
:@"
\"" withString
:@"
\\\""
]
24 stringByReplacingOccurrencesOfString
:@"
\n" withString
:@"
\\n"
];
25 return [NSString stringWithFormat
:@"
\"%@\"", str];
27 return [NSString stringWithString
:str
];
29 } else if ([obj isKindOfClass
:[NSArray
class]]) {
30 NSMutableArray
* elems
= [NSMutableArray array
];
31 for (NSObject
* elem in
(NSArray
*)obj
) {
32 [elems addObject
:_pr_str
(elem
, print_readably
)];
34 if ([obj isKindOfClass
:[MalVector
class]]) {
35 return [NSString stringWithFormat
:@"
[%@]",
36 [elems componentsJoinedByString
:@" "
]];
38 return [NSString stringWithFormat
:@"
(%@)",
39 [elems componentsJoinedByString
:@" "
]];
41 } else if ([obj isKindOfClass
:[NSDictionary
class]]) {
42 NSDictionary
* dict
= (NSDictionary
*)obj
;
43 NSMutableArray
* elems
= [NSMutableArray array
];
44 for (NSString
* key in dict
) {
45 [elems addObject
:_pr_str
(key
, print_readably
)];
46 [elems addObject
:_pr_str
(dict
[key
], print_readably
)];
48 return [NSString stringWithFormat
:@"
{%@}",
49 [elems componentsJoinedByString
:@" "
]];
50 } else if (block_Q
(obj
)) {
51 return @"#
<native
function>"
;
52 } else if (atom_Q
(obj
)) {
53 return [NSString stringWithFormat
:@"
(atom
%@)",
54 _pr_str
([(MalAtom
*)obj val
], print_readably
)];
56 return [obj description
];