]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/interpreted/IApply.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / internal / interpreted / IApply.java
1 package org.simantics.scl.compiler.internal.interpreted;
2
3 import org.simantics.scl.runtime.function.Function;
4
5 public class IApply implements IExpression {
6     private final IExpression function;
7     private final IExpression[] parameters;
8     
9     public IApply(IExpression function, IExpression[] parameters) {
10         if(function instanceof IApply) {
11             IApply apply = (IApply)function;
12             this.function = apply.function;
13             this.parameters = new IExpression[apply.parameters.length + parameters.length];
14             System.arraycopy(apply.parameters, 0, this.parameters, 0, apply.parameters.length);
15             System.arraycopy(parameters, 0, this.parameters, apply.parameters.length, parameters.length);
16         }
17         else {
18             this.function = function;
19             this.parameters = parameters;
20         }
21     }
22
23     @SuppressWarnings("rawtypes")
24     @Override
25     public Object execute(Object[] variableBindings) {
26         Object[] parameterValues = new Object[parameters.length];
27         for(int i=0;i<parameters.length;++i)
28             parameterValues[i] = parameters[i].execute(variableBindings);
29         return ((Function)function.execute(variableBindings)).applyArray(parameterValues);
30     }
31     
32     @Override
33     public String toString() {
34         StringBuilder b = new StringBuilder();
35         b.append('(');
36         b.append(function);
37         for(IExpression parameter : parameters) {
38             b.append(' ');
39             b.append(parameter);
40         }
41         b.append(')');
42         return b.toString();
43     }
44 }