// Path: src/main/java/net/liujiacai/jcscheme/JCExpression.java
// public class JCExpression {
// 	private String value;
// 	private JCExpression parent;
// 	private List<JCExpression> children;
// 
// 	public JCExpression(String value, JCExpression parent) {
// 		this.value = value;
// 		this.parent = parent;
// 		this.children = new ArrayList<>();
// 	}
// 
// 	public boolean addChild(JCExpression child) {
// 		return this.children.add(child);
// 	}
// 
// 	public List<JCExpression> getChildren() {
// 		return children;
// 	}
// 
// 	public JCExpression getParent() {
// 		return this.parent;
// 	}
// 
// 	public String getValue() {
// 		return value;
// 	}
// 
// 	private boolean isSelfEval() {
//         return children.size() == 0;
//     }
// 
//     public JCObject eval(JCEnvironment env) {
// 
// 		if (isSelfEval()) {
//             return ApplyUtil.selfEvalApply(this, env);
// 		} else {
// 			String operator = children.get(0).getValue();
//             if (EnvUtil.builtinKeywords.contains(operator)) {
//                 return ApplyUtil.keywordApply(operator, this, env);
//             } else {
//                 return ApplyUtil.functionApply(operator, this, env);
//             }
// 		}
// 	}
// 
// 	@Override
// 	public String toString() {
// 		if (0 == children.size()) {
// 			return value;
// 		} else {
// 			StringBuffer displayBuffer = new StringBuffer(value + " ");
// 			for (JCExpression child : children) {
// 				displayBuffer.append(child.toString() + " ");
// 			}
// 			return displayBuffer.toString();
// 		}
// 	}
// }
// 
// Path: src/main/java/net/liujiacai/jcscheme/JCEnvironment.java
// public class JCEnvironment {
// 	private JCEnvironment parent;
// 	private Map<String, JCObject> env;
// 
// 	public JCEnvironment getParent() {
// 		return parent;
// 	}
// 
// 	public Map<String, JCObject> getEnv() {
// 		return env;
// 	}
// 
// 	public JCObject findVariable(String var) {
// 		if (env.containsKey(var)) {
// 			return env.get(var);
// 		} else {
// 			JCEnvironment p = this.getParent();
// 			while (p != null) {
// 				Map<String, JCObject> subEnv = p.getEnv();
// 				if (subEnv.containsKey(var)) {
// 					return subEnv.get(var);
// 				}
// 				p = p.getParent();
// 			}
// 			return null;
// 		}
// 	}
// 
// 	public void addVariable(String var, JCObject val) {
//         getEnv().put(var, val);
//     }
// 
// 	public JCEnvironment(JCEnvironment parent) {
// 		this.parent = parent;
// 		this.env = new HashMap<String, JCObject>();
// 	}
// 
// }


import net.liujiacai.jcscheme.JCExpression;
import net.liujiacai.jcscheme.JCEnvironment;
import java.util.Arrays;
import java.util.List;
package net.liujiacai.jcscheme.type;



public class JCFunction extends JCObject {

	private List<String> param;
// Path: src/main/java/net/liujiacai/jcscheme/JCExpression.java
// public class JCExpression {
// 	private String value;
// 	private JCExpression parent;
// 	private List<JCExpression> children;
// 
// 	public JCExpression(String value, JCExpression parent) {
// 		this.value = value;
// 		this.parent = parent;
// 		this.children = new ArrayList<>();
// 	}
// 
// 	public boolean addChild(JCExpression child) {
// 		return this.children.add(child);
// 	}
// 
// 	public List<JCExpression> getChildren() {
// 		return children;
// 	}
// 
// 	public JCExpression getParent() {
// 		return this.parent;
// 	}
// 
// 	public String getValue() {
// 		return value;
// 	}
// 
// 	private boolean isSelfEval() {
//         return children.size() == 0;
//     }
// 
//     public JCObject eval(JCEnvironment env) {
// 
// 		if (isSelfEval()) {
//             return ApplyUtil.selfEvalApply(this, env);
// 		} else {
// 			String operator = children.get(0).getValue();
//             if (EnvUtil.builtinKeywords.contains(operator)) {
//                 return ApplyUtil.keywordApply(operator, this, env);
//             } else {
//                 return ApplyUtil.functionApply(operator, this, env);
//             }
// 		}
// 	}
// 
// 	@Override
// 	public String toString() {
// 		if (0 == children.size()) {
// 			return value;
// 		} else {
// 			StringBuffer displayBuffer = new StringBuffer(value + " ");
// 			for (JCExpression child : children) {
// 				displayBuffer.append(child.toString() + " ");
// 			}
// 			return displayBuffer.toString();
// 		}
// 	}
// }
// 
// Path: src/main/java/net/liujiacai/jcscheme/JCEnvironment.java
// public class JCEnvironment {
// 	private JCEnvironment parent;
// 	private Map<String, JCObject> env;
// 
// 	public JCEnvironment getParent() {
// 		return parent;
// 	}
// 
// 	public Map<String, JCObject> getEnv() {
// 		return env;
// 	}
// 
// 	public JCObject findVariable(String var) {
// 		if (env.containsKey(var)) {
// 			return env.get(var);
// 		} else {
// 			JCEnvironment p = this.getParent();
// 			while (p != null) {
// 				Map<String, JCObject> subEnv = p.getEnv();
// 				if (subEnv.containsKey(var)) {
// 					return subEnv.get(var);
// 				}
// 				p = p.getParent();
// 			}
// 			return null;
// 		}
// 	}
// 
// 	public void addVariable(String var, JCObject val) {
//         getEnv().put(var, val);
//     }
// 
// 	public JCEnvironment(JCEnvironment parent) {
// 		this.parent = parent;
// 		this.env = new HashMap<String, JCObject>();
// 	}
// 
// }


// Path: src/main/java/net/liujiacai/jcscheme/type/JCFunction.java
import net.liujiacai.jcscheme.JCExpression;
import net.liujiacai.jcscheme.JCEnvironment;
import java.util.Arrays;
import java.util.List;

package net.liujiacai.jcscheme.type;



public class JCFunction extends JCObject {

	private List<String> param;
	private List<JCExpression> body;