DISABLE FDs (REMOVE ME).
[jackhill/mal.git] / objc / malfunc.m
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;
10 @synthesize isMacro = _isMacro;
11 @synthesize meta = _meta;
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;
19 _isMacro = false;
20 _meta = [NSNull alloc];
21 }
22 return self;
23 }
24
25 - (id)apply:(NSArray *)args {
26 return EVAL(_ast, [Env fromBindings:_env binds:_params exprs:args]);
27 }
28
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
39 @end
40
41
42 NSObject * 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 }