-
Notifications
You must be signed in to change notification settings - Fork 0
/
LambdaFunction.java
78 lines (63 loc) · 2.06 KB
/
LambdaFunction.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package crono.type;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import crono.Environment;
import crono.Visitor;
public class LambdaFunction extends Function {
public final Symbol[] arglist;
public final CronoType[] body; /*< AST head node */
public final Environment environment; /*< for scoping */
public LambdaFunction(Symbol[] args, CronoType[] body, Environment env) {
/*
* We might want this to specify argument type later
*/
super(new TypeId[args.length], CronoType.TYPEID, args.length);
for(int i = 0; i < args.length; ++i) {
this.args[i] = CronoType.TYPEID;
}
this.arglist = args;
this.body = body;
this.environment = new Environment(env);
}
public LambdaFunction(LambdaFunction fun) {
this(fun.arglist, fun.body, fun.environment);
}
public int arity() {
return arglist.length;
}
public boolean variadic() {
return false;
}
public EvalType eval() {
return Function.EvalType.FULL;
}
public CronoType run(Visitor v, List<CronoType> args) {
Environment env = new Environment(environment);
for(int i = 0; i < arglist.length; ++i) {
env.put(arglist[i], args.remove(0));
}
v.pushEnv(env);
CronoType ret = null;
for(int i = 0; i < body.length; ++i) {
ret = body[i].accept(v);
}
v.popEnv();
return ret;
}
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("(");
if(arglist.length > 0) {
for(int i = 0; i < arglist.length - 1; ++i) {
builder.append(arglist[i]);
builder.append(" ");
}
builder.append(arglist[arglist.length - 1]);
}
builder.append(")");
String bodystr =
(body.length > 1) ? Arrays.toString(body) : body[0].toString();
return String.format("(Lambda %s %s)", builder.toString(), body);
}
}