// Path: src/main/java/net/liujiacai/jcscheme/type/JCObject.java
// public abstract class JCObject {
// 
// }
// 
// Path: src/main/java/net/liujiacai/jcscheme/util/EnvUtil.java
// public class EnvUtil {
// 
//     public static Map<String, String> builtinFuncs;
// 
//     public static Set<String> builtinKeywords;
// 
//     static {
//         builtinFuncs = new HashMap<>();
//         builtinKeywords  = new HashSet<>();
// 
//         // number
//         builtinFuncs.put(JCConstants.ADD, "net.liujiacai.jcscheme.builtin.JCNumberFuncs.add");
//         builtinFuncs.put(JCConstants.SUB, "net.liujiacai.jcscheme.builtin.JCNumberFuncs.sub");
//         builtinFuncs.put(JCConstants.MUL, "net.liujiacai.jcscheme.builtin.JCNumberFuncs.mul");
//         builtinFuncs.put(JCConstants.DIV, "net.liujiacai.jcscheme.builtin.JCNumberFuncs.div");
//         builtinFuncs.put(JCConstants.EQ, "net.liujiacai.jcscheme.builtin.JCNumberFuncs.equalTo");
//         builtinFuncs.put(JCConstants.GT, "net.liujiacai.jcscheme.builtin.JCNumberFuncs.greatThan");
//         builtinFuncs.put(JCConstants.LT, "net.liujiacai.jcscheme.builtin.JCNumberFuncs.lessThan");
//         // pair list
//         builtinFuncs.put(JCConstants.CONS, "net.liujiacai.jcscheme.builtin.JCPairFuncs.cons");
//         builtinFuncs.put(JCConstants.CAR, "net.liujiacai.jcscheme.builtin.JCPairFuncs.car");
//         builtinFuncs.put(JCConstants.CDR, "net.liujiacai.jcscheme.builtin.JCPairFuncs.cdr");
//         builtinFuncs.put(JCConstants.LIST, "net.liujiacai.jcscheme.builtin.JCListFuncs.list");
//         builtinFuncs.put(JCConstants.NULL, "net.liujiacai.jcscheme.builtin.JCListFuncs.isNull");
//         // string
//         builtinFuncs.put(JCConstants.STR_EQ, "net.liujiacai.jcscheme.builtin.JCStringFuncs.equalTo");
//         // bool
//         builtinFuncs.put(JCConstants.AND, "net.liujiacai.jcscheme.builtin.JCBoolFuncs.and");
//         builtinFuncs.put(JCConstants.OR, "net.liujiacai.jcscheme.builtin.JCBoolFuncs.or");
//         builtinFuncs.put(JCConstants.NOT, "net.liujiacai.jcscheme.builtin.JCBoolFuncs.not");
//         // helper
//         builtinFuncs.put(JCConstants.PRINT, "net.liujiacai.jcscheme.builtin.OtherFuncs.print");
// 
//         // keyword
//         builtinKeywords.add(JCConstants.DEF);
//         builtinKeywords.add(JCConstants.LAMBDA);
//         builtinKeywords.add(JCConstants.IF);
//     }
// 
//     public static JCEnvironment init() {
// 
//         JCEnvironment rootEnv = new JCEnvironment(null);
// 
//         return rootEnv;
//     }
// }


import net.liujiacai.jcscheme.type.JCObject;
import net.liujiacai.jcscheme.util.EnvUtil;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
            public void run() {
                future.cancel(true);
                String[] byebye = {
                        "Thanks for your tryout!",
                        "Find more about JCScheme at http://github.com/jiacai2050/JCScheme",
                        "Have Fun, Bye Bye... "};
                System.out.println();
                System.out.println();
                for (String msg : byebye) {
                    System.out.println(msg);
                }
            }
        });
    }
}

class ReadPrintLoop implements Runnable {
    BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
    JCEnvironment rootEnv = EnvUtil.init();

    public void run() {
        String src;
        while (true) {
            System.out.print(">> ");
            try {
                src = console.readLine();
                if (!"".equals(src.trim())) {
                    String[] tokens = JCParser.tokenize(src);
                    JCExpression program = JCParser.parse(tokens);
                    // JCParser.prettyPrint(program);
// Path: src/main/java/net/liujiacai/jcscheme/type/JCObject.java
// public abstract class JCObject {
// 
// }
// 
// Path: src/main/java/net/liujiacai/jcscheme/util/EnvUtil.java
// public class EnvUtil {
// 
//     public static Map<String, String> builtinFuncs;
// 
//     public static Set<String> builtinKeywords;
// 
//     static {
//         builtinFuncs = new HashMap<>();
//         builtinKeywords  = new HashSet<>();
// 
//         // number
//         builtinFuncs.put(JCConstants.ADD, "net.liujiacai.jcscheme.builtin.JCNumberFuncs.add");
//         builtinFuncs.put(JCConstants.SUB, "net.liujiacai.jcscheme.builtin.JCNumberFuncs.sub");
//         builtinFuncs.put(JCConstants.MUL, "net.liujiacai.jcscheme.builtin.JCNumberFuncs.mul");
//         builtinFuncs.put(JCConstants.DIV, "net.liujiacai.jcscheme.builtin.JCNumberFuncs.div");
//         builtinFuncs.put(JCConstants.EQ, "net.liujiacai.jcscheme.builtin.JCNumberFuncs.equalTo");
//         builtinFuncs.put(JCConstants.GT, "net.liujiacai.jcscheme.builtin.JCNumberFuncs.greatThan");
//         builtinFuncs.put(JCConstants.LT, "net.liujiacai.jcscheme.builtin.JCNumberFuncs.lessThan");
//         // pair list
//         builtinFuncs.put(JCConstants.CONS, "net.liujiacai.jcscheme.builtin.JCPairFuncs.cons");
//         builtinFuncs.put(JCConstants.CAR, "net.liujiacai.jcscheme.builtin.JCPairFuncs.car");
//         builtinFuncs.put(JCConstants.CDR, "net.liujiacai.jcscheme.builtin.JCPairFuncs.cdr");
//         builtinFuncs.put(JCConstants.LIST, "net.liujiacai.jcscheme.builtin.JCListFuncs.list");
//         builtinFuncs.put(JCConstants.NULL, "net.liujiacai.jcscheme.builtin.JCListFuncs.isNull");
//         // string
//         builtinFuncs.put(JCConstants.STR_EQ, "net.liujiacai.jcscheme.builtin.JCStringFuncs.equalTo");
//         // bool
//         builtinFuncs.put(JCConstants.AND, "net.liujiacai.jcscheme.builtin.JCBoolFuncs.and");
//         builtinFuncs.put(JCConstants.OR, "net.liujiacai.jcscheme.builtin.JCBoolFuncs.or");
//         builtinFuncs.put(JCConstants.NOT, "net.liujiacai.jcscheme.builtin.JCBoolFuncs.not");
//         // helper
//         builtinFuncs.put(JCConstants.PRINT, "net.liujiacai.jcscheme.builtin.OtherFuncs.print");
// 
//         // keyword
//         builtinKeywords.add(JCConstants.DEF);
//         builtinKeywords.add(JCConstants.LAMBDA);
//         builtinKeywords.add(JCConstants.IF);
//     }
// 
//     public static JCEnvironment init() {
// 
//         JCEnvironment rootEnv = new JCEnvironment(null);
// 
//         return rootEnv;
//     }
// }


// Path: src/main/java/net/liujiacai/jcscheme/Main.java
import net.liujiacai.jcscheme.type.JCObject;
import net.liujiacai.jcscheme.util.EnvUtil;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

            public void run() {
                future.cancel(true);
                String[] byebye = {
                        "Thanks for your tryout!",
                        "Find more about JCScheme at http://github.com/jiacai2050/JCScheme",
                        "Have Fun, Bye Bye... "};
                System.out.println();
                System.out.println();
                for (String msg : byebye) {
                    System.out.println(msg);
                }
            }
        });
    }
}

class ReadPrintLoop implements Runnable {
    BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
    JCEnvironment rootEnv = EnvUtil.init();

    public void run() {
        String src;
        while (true) {
            System.out.print(">> ");
            try {
                src = console.readLine();
                if (!"".equals(src.trim())) {
                    String[] tokens = JCParser.tokenize(src);
                    JCExpression program = JCParser.parse(tokens);
                    // JCParser.prettyPrint(program);
                    JCObject val = program.eval(rootEnv);