DISABLE FDs (REMOVE ME).
[jackhill/mal.git] / objc / malfunc.m
CommitLineData
57350ed7
JM
1#import "types.h"
2
3#import "malfunc.h"
4
5@implementation MalFunc
6
7@synthesize ast = _ast;
8@synthesize env = _env;
9@synthesize params = _params;
7cae6e6f
JM
10@synthesize isMacro = _isMacro;
11@synthesize meta = _meta;
57350ed7
JM
12
13- (id)init:(NSArray *)ast env:(Env *)env params:(NSArray *)params {
14 self = [super init];
15 if (self) {
16 _ast = ast;
17 _env = env;
18 _params = params;
7cae6e6f
JM
19 _isMacro = false;
20 _meta = [NSNull alloc];
57350ed7
JM
21 }
22 return self;
23}
24
25- (id)apply:(NSArray *)args {
26 return EVAL(_ast, [Env fromBindings:_env binds:_params exprs:args]);
27}
28
7cae6e6f
JM
29- (id)copyWithZone:(NSZone *)zone
30{
31 MalFunc * copy = [[[self class] alloc] init:_ast env:_env params:_params];
32 if (copy) {
33 copy.isMacro = _isMacro;
34 copy.meta = _meta;
35 }
36 return copy;
37}
38
57350ed7 39@end
7cae6e6f
JM
40
41
42NSObject * apply(id f, NSArray *args) {
43 if ([f isKindOfClass:[MalFunc class]]) {
44 return [f apply:args];
45 } else {
46 NSObject * (^ fn)(NSArray *) = f;
47 return fn(args);
48 }
49}