Commit | Line | Data |
---|---|---|
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 | ||
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 | } |