/*
* Created on May 15, 2005
*/
package org.seqcode.gseutils.expressions;
import java.util.*;
/**
* @author tdanford
*/
public class LambdaExpression extends CompoundExpression {
private CompoundExpression params, body;
private Vector<String> paramNames;
private Set<String> paramSet;
public LambdaExpression(CompoundExpression params, CompoundExpression body) {
super(new SimpleExpression("lambda"));
this.params = params;
this.body = body;
exprs.add(params);
exprs.add(body);
paramSet = new HashSet<String>();
paramNames = new Vector<String>();
for(Expression e : params.exprs) {
if(!(e instanceof SimpleExpression)) {
throw new IllegalArgumentException();
}
String token = ((SimpleExpression)e).getValue();
if(paramSet.contains(token)) { throw new IllegalArgumentException(); }
paramSet.add(token);
paramNames.add(token);
}
}
public Expression substitute(String token, String value) {
CompoundExpression newBody = body;
if(!(paramSet.contains(token))) {
newBody = (CompoundExpression)newBody.substitute(token, value);
}
return new LambdaExpression(params, newBody);
}
public Expression call(Vector<Expression> args) {
if(args.size() != paramNames.size()) { throw new IllegalArgumentException(); }
Expression e = body;
for(int i = 0; i < args.size(); i++) {
e = e.substitute(paramNames.get(i), args.get(i).toString());
}
return e;
}
public Set<String> findFreeTerms() {
Set<String> s = super.findFreeTerms();
HashSet<String> ns = new HashSet<String>();
for(String term : s) {
if(!paramSet.contains(term)) { ns.add(term); }
}
return ns;
}
}