1 package org.simantics.scl.compiler.internal.interpreted;
3 import org.simantics.scl.runtime.function.FunctionImpl1;
4 import org.simantics.scl.runtime.function.FunctionImpl2;
5 import org.simantics.scl.runtime.function.FunctionImpl3;
6 import org.simantics.scl.runtime.function.FunctionImpl4;
7 import org.simantics.scl.runtime.function.FunctionImplN;
9 public class ILambda implements IExpression {
10 private final int[] inheritedVariableIds;
11 private final int arity;
12 private final int variableBindingsLength;
13 private final IExpression body;
15 public ILambda(int[] inheritedVariableIds, int arity,
16 int variableBindingsLength, IExpression body) {
17 this.inheritedVariableIds = inheritedVariableIds;
19 this.variableBindingsLength = variableBindingsLength;
23 @SuppressWarnings("rawtypes")
25 public Object execute(Object[] variableBindings) {
26 final Object[] inheritedVariableBindings = new Object[inheritedVariableIds.length];
27 for(int i=0;i<inheritedVariableIds.length;++i)
28 inheritedVariableBindings[i] = variableBindings[inheritedVariableIds[i]];
31 return new FunctionImpl1() {
33 public Object apply(Object param0) {
34 Object[] newVariableBindings = new Object[variableBindingsLength];
36 for(;i < inheritedVariableBindings.length;++i)
37 newVariableBindings[i] = inheritedVariableBindings[i];
38 newVariableBindings[i] = param0;
39 return body.execute(newVariableBindings);
43 public String toString() {
44 return ILambda.this.toString(inheritedVariableBindings);
48 return new FunctionImpl2() {
50 public Object apply(Object param0, Object param1) {
51 Object[] newVariableBindings = new Object[variableBindingsLength];
53 for(;i < inheritedVariableBindings.length;++i)
54 newVariableBindings[i] = inheritedVariableBindings[i];
55 newVariableBindings[i++] = param0;
56 newVariableBindings[i] = param1;
57 return body.execute(newVariableBindings);
61 public String toString() {
62 return ILambda.this.toString(inheritedVariableBindings);
66 return new FunctionImpl3() {
68 public Object apply(Object param0, Object param1, Object param2) {
69 Object[] newVariableBindings = new Object[variableBindingsLength];
71 for(;i < inheritedVariableBindings.length;++i)
72 newVariableBindings[i] = inheritedVariableBindings[i];
73 newVariableBindings[i++] = param0;
74 newVariableBindings[i++] = param1;
75 newVariableBindings[i] = param2;
76 return body.execute(newVariableBindings);
80 public String toString() {
81 return ILambda.this.toString(inheritedVariableBindings);
85 return new FunctionImpl4() {
87 public Object apply(Object param0, Object param1, Object param2, Object param3) {
88 Object[] newVariableBindings = new Object[variableBindingsLength];
90 for(;i < inheritedVariableBindings.length;++i)
91 newVariableBindings[i] = inheritedVariableBindings[i];
92 newVariableBindings[i++] = param0;
93 newVariableBindings[i++] = param1;
94 newVariableBindings[i++] = param2;
95 newVariableBindings[i] = param3;
96 return body.execute(newVariableBindings);
100 public String toString() {
101 return ILambda.this.toString(inheritedVariableBindings);
105 return new FunctionImplN(arity) {
107 public Object doApply(Object... ps) {
108 Object[] newVariableBindings = new Object[variableBindingsLength];
110 for(;i < inheritedVariableBindings.length;++i)
111 newVariableBindings[i] = inheritedVariableBindings[i];
113 newVariableBindings[i++] = p;
114 return body.execute(newVariableBindings);
118 public String toString() {
119 return ILambda.this.toString(inheritedVariableBindings);
126 public String toString() {
127 StringBuilder b = new StringBuilder();
129 for(int i=0;i<inheritedVariableIds.length;++i)
130 b.append('v').append(i)
131 .append("(v").append(inheritedVariableIds[i]).append(") ");
132 for(int i=0;i<arity;++i)
133 b.append('v').append(i+inheritedVariableIds.length).append(' ');
140 public String toString(Object[] variableBindings) {
141 StringBuilder sb = new StringBuilder();
142 appendVariableBindings(sb, variableBindings);
143 sb.append(this.toString());
144 return sb.toString();
147 private static void appendVariableBindings(StringBuilder sb, Object[] variableBindings) {
148 if (variableBindings.length > 0) {
150 for(int i = 0; i < variableBindings.length; i++) {
151 if (i > 0) sb.append("; ");
152 sb.append("v").append(i).append("=").append(variableBindings[i].toString());