1 package org.simantics.scl.compiler.internal.interpreted;
3 import java.util.Arrays;
5 import org.simantics.scl.runtime.function.FunctionImpl1;
6 import org.simantics.scl.runtime.function.FunctionImpl2;
7 import org.simantics.scl.runtime.function.FunctionImpl3;
8 import org.simantics.scl.runtime.function.FunctionImpl4;
9 import org.simantics.scl.runtime.function.FunctionImplN;
11 public class ILambda implements IExpression {
12 private final class Arity1Func extends FunctionImpl1 {
13 private final Object[] inheritedVariableBindings;
15 private Arity1Func(Object[] inheritedVariableBindings) {
16 this.inheritedVariableBindings = inheritedVariableBindings;
20 public Object apply(Object param0) {
21 Object[] newVariableBindings = new Object[variableBindingsLength];
23 for(;i < inheritedVariableBindings.length;++i)
24 newVariableBindings[i] = inheritedVariableBindings[i];
25 newVariableBindings[i] = param0;
26 return body.execute(newVariableBindings);
30 public String toString() {
31 return ILambda.this.toString(inheritedVariableBindings);
35 public int hashCode() {
36 return ILambda.this.hashCode() + 31*Arrays.hashCode(inheritedVariableBindings);
39 private ILambda getParent() {
44 public boolean equals(Object obj) {
47 if(obj == null || obj.getClass() != getClass())
49 Arity1Func other = (Arity1Func)obj;
50 return ILambda.this == other.getParent() && Arrays.equals(inheritedVariableBindings, other.inheritedVariableBindings);
54 private final class Arity2Func extends FunctionImpl2 {
55 private final Object[] inheritedVariableBindings;
57 private Arity2Func(Object[] inheritedVariableBindings) {
58 this.inheritedVariableBindings = inheritedVariableBindings;
62 public Object apply(Object param0, Object param1) {
63 Object[] newVariableBindings = new Object[variableBindingsLength];
65 for(;i < inheritedVariableBindings.length;++i)
66 newVariableBindings[i] = inheritedVariableBindings[i];
67 newVariableBindings[i++] = param0;
68 newVariableBindings[i] = param1;
69 return body.execute(newVariableBindings);
73 public String toString() {
74 return ILambda.this.toString(inheritedVariableBindings);
78 public int hashCode() {
79 return ILambda.this.hashCode() + 31*Arrays.hashCode(inheritedVariableBindings);
82 private ILambda getParent() {
87 public boolean equals(Object obj) {
90 if(obj == null || obj.getClass() != getClass())
92 Arity2Func other = (Arity2Func)obj;
93 return ILambda.this == other.getParent() && Arrays.equals(inheritedVariableBindings, other.inheritedVariableBindings);
97 private final class Arity3Func extends FunctionImpl3 {
98 private final Object[] inheritedVariableBindings;
100 private Arity3Func(Object[] inheritedVariableBindings) {
101 this.inheritedVariableBindings = inheritedVariableBindings;
105 public Object apply(Object param0, Object param1, Object param2) {
106 Object[] newVariableBindings = new Object[variableBindingsLength];
108 for(;i < inheritedVariableBindings.length;++i)
109 newVariableBindings[i] = inheritedVariableBindings[i];
110 newVariableBindings[i++] = param0;
111 newVariableBindings[i++] = param1;
112 newVariableBindings[i] = param2;
113 return body.execute(newVariableBindings);
117 public String toString() {
118 return ILambda.this.toString(inheritedVariableBindings);
122 public int hashCode() {
123 return ILambda.this.hashCode() + 31*Arrays.hashCode(inheritedVariableBindings);
126 private ILambda getParent() {
131 public boolean equals(Object obj) {
134 if(obj == null || obj.getClass() != getClass())
136 Arity3Func other = (Arity3Func)obj;
137 return ILambda.this == other.getParent() && Arrays.equals(inheritedVariableBindings, other.inheritedVariableBindings);
141 private final class Arity4Func extends FunctionImpl4 {
142 private final Object[] inheritedVariableBindings;
144 private Arity4Func(Object[] inheritedVariableBindings) {
145 this.inheritedVariableBindings = inheritedVariableBindings;
149 public Object apply(Object param0, Object param1, Object param2, Object param3) {
150 Object[] newVariableBindings = new Object[variableBindingsLength];
152 for(;i < inheritedVariableBindings.length;++i)
153 newVariableBindings[i] = inheritedVariableBindings[i];
154 newVariableBindings[i++] = param0;
155 newVariableBindings[i++] = param1;
156 newVariableBindings[i++] = param2;
157 newVariableBindings[i] = param3;
158 return body.execute(newVariableBindings);
162 public String toString() {
163 return ILambda.this.toString(inheritedVariableBindings);
167 public int hashCode() {
168 return ILambda.this.hashCode() + 31*Arrays.hashCode(inheritedVariableBindings);
171 private ILambda getParent() {
176 public boolean equals(Object obj) {
179 if(obj == null || obj.getClass() != getClass())
181 Arity4Func other = (Arity4Func)obj;
182 return ILambda.this == other.getParent() && Arrays.equals(inheritedVariableBindings, other.inheritedVariableBindings);
186 private final class ArityNFunc extends FunctionImplN {
187 private final Object[] inheritedVariableBindings;
189 private ArityNFunc(Object[] inheritedVariableBindings) {
191 this.inheritedVariableBindings = inheritedVariableBindings;
195 public Object doApply(Object... ps) {
196 Object[] newVariableBindings = new Object[variableBindingsLength];
198 for(;i < inheritedVariableBindings.length;++i)
199 newVariableBindings[i] = inheritedVariableBindings[i];
201 newVariableBindings[i++] = p;
202 return body.execute(newVariableBindings);
206 public String toString() {
207 return ILambda.this.toString(inheritedVariableBindings);
211 public int hashCode() {
212 return ILambda.this.hashCode() + 31*Arrays.hashCode(inheritedVariableBindings);
215 private ILambda getParent() {
220 public boolean equals(Object obj) {
223 if(obj == null || obj.getClass() != getClass())
225 ArityNFunc other = (ArityNFunc)obj;
226 return ILambda.this == other.getParent() && Arrays.equals(inheritedVariableBindings, other.inheritedVariableBindings);
230 private final int[] inheritedVariableIds;
231 private final int arity;
232 private final int variableBindingsLength;
233 private final IExpression body;
235 public ILambda(int[] inheritedVariableIds, int arity,
236 int variableBindingsLength, IExpression body) {
237 this.inheritedVariableIds = inheritedVariableIds;
239 this.variableBindingsLength = variableBindingsLength;
244 public Object execute(Object[] variableBindings) {
245 final Object[] inheritedVariableBindings = new Object[inheritedVariableIds.length];
246 for(int i=0;i<inheritedVariableIds.length;++i)
247 inheritedVariableBindings[i] = variableBindings[inheritedVariableIds[i]];
250 return new Arity1Func(inheritedVariableBindings);
252 return new Arity2Func(inheritedVariableBindings);
254 return new Arity3Func(inheritedVariableBindings);
256 return new Arity4Func(inheritedVariableBindings);
258 return new ArityNFunc(inheritedVariableBindings);
263 public String toString() {
264 StringBuilder b = new StringBuilder();
266 for(int i=0;i<inheritedVariableIds.length;++i)
267 b.append('v').append(i)
268 .append("(v").append(inheritedVariableIds[i]).append(") ");
269 for(int i=0;i<arity;++i)
270 b.append('v').append(i+inheritedVariableIds.length).append(' ');
277 public String toString(Object[] variableBindings) {
278 StringBuilder sb = new StringBuilder();
279 appendVariableBindings(sb, variableBindings);
280 sb.append(this.toString());
281 return sb.toString();
284 private static void appendVariableBindings(StringBuilder sb, Object[] variableBindings) {
285 if (variableBindings.length > 0) {
287 for(int i = 0; i < variableBindings.length; i++) {
288 if (i > 0) sb.append("; ");
289 sb.append("v").append(i).append("=").append(variableBindings[i].toString());