3 @implementation MalTrue
6 @implementation MalFalse
10 // NSString subclassing based on
:
11 // http
://stackoverflow.com
/a
/21331422/471795
15 @interface MalSymbol
()
16 @property
(nonatomic
, strong
) NSString
*stringHolder
;
19 @implementation MalSymbol
21 - (instancetype
)initWithCharactersNoCopy
:(unichar
*)characters
length:(NSUInteger
)length freeWhenDone
:(BOOL
)freeBuffer
{
24 self.stringHolder
= [[NSString alloc
] initWithCharactersNoCopy
:characters
length:length freeWhenDone
:freeBuffer
];
29 - (NSUInteger
)length {
30 return self.stringHolder.
length;
33 - (unichar
)characterAtIndex
:(NSUInteger
)index
{
34 return [self.stringHolder characterAtIndex
:index
];
40 BOOL string_Q
(id obj
) {
41 if ([obj isKindOfClass
:[NSString
class]]) {
43 if (![s isKindOfClass
:[MalSymbol
class]]) {
44 return ![s hasPrefix
:@"
\u029e"
];
53 return ([obj isKindOfClass
:[NSArray
class]] &&
54 ![obj isKindOfClass
:[MalVector
class]]);
57 NSArray
* _rest
(NSArray
* obj
) {
58 return [obj subarrayWithRange
:NSMakeRange
(1, [obj count
]-1)];
63 @implementation MalVector
65 @synthesize array
= _array
;
66 @synthesize count
= _count
;
68 - (id
)initWithArray
:(NSArray
*)arr
{
78 return [self initWithArray
:@
[]];
81 + (id
)fromArray
:(NSArray
*)arr
{
82 return [[MalVector alloc
] initWithArray
:arr
];
85 - (id
)objectAtIndex
:(NSUInteger
)index
{
94 NSDictionary
* assoc_BANG
(NSMutableDictionary
* d
, NSArray
* kvs
) {
95 for (int i
=0; i
< [kvs count
]; i
+=2) {
101 NSDictionary
* hash_map
(NSArray
*kvs
) {
102 return assoc_BANG
([NSMutableDictionary dictionary
], kvs
);
108 BOOL block_Q
(id obj
) {
110 Class blockClass
= [block
class];
111 while ([blockClass superclass
] != [NSObject
class]) {
112 blockClass
= [blockClass superclass
];
114 return [obj isKindOfClass
:blockClass
];
119 @implementation MalAtom
121 @synthesize val
= _val
;
123 - (id
)init
:(NSObject
*)val
{
131 + (id
)fromObject
:(NSObject
*)val
{
132 return [[MalAtom alloc
] init
:val
];
137 BOOL atom_Q
(id obj
) {
138 return [obj isKindOfClass
:[MalAtom
class]];
143 BOOL sequential_Q
(NSObject
* obj
) {
144 return [obj isKindOfClass
:[NSArray
class]];
147 BOOL equal_Q
(NSObject
* a
, NSObject
* b
) {
148 //NSLog
(@"
= %@ (%@), %@ (%@)", a, [a class], b, [b class]);
149 if (!(([a
class] == [b
class]) ||
150 ([a isKindOfClass
:[NSArray
class]] &&
151 [b isKindOfClass
:[NSArray
class]]) ||
152 ([a isKindOfClass
:[NSNumber
class]] &&
153 [b isKindOfClass
:[NSNumber
class]]))) {
156 if ([a isKindOfClass
:[MalTrue
class]]) {
158 } else if ([a isKindOfClass
:[MalFalse
class]]) {
160 } else if ([a isKindOfClass
:[NSNumber
class]]) {
161 return [(NSNumber
*)a intValue
] == [(NSNumber
*)b intValue
];
163 return [a
isEqual:b
];