// Path: lang/src/main/java/mumbler/truffle/syntax/ListSyntax.java
// public class ListSyntax extends Syntax<MumblerList<? extends Syntax<?>>> {
//     public ListSyntax(MumblerList<? extends Syntax<?>> value,
//             SourceSection sourceSection) {
//         super(value, sourceSection);
//     }
// 
//     @Override
//     public Object strip() {
//         List<Object> list = new ArrayList<Object>();
//         for (Syntax<? extends Object> syntax : getValue()) {
//             list.add(syntax.strip());
//         }
//         return MumblerList.list(list);
//     }
// 
//     @Override
//     public String getName() {
//         if (super.getName() != null) {
//             return super.getName();
//         }
//         if (this.getValue().size() == 0) {
//             return "()";
//         }
//         return this.getValue().car().getValue().toString() + "-" + this.hashCode();
//     }
// }
// 
// Path: lang/src/main/java/mumbler/truffle/syntax/SymbolSyntax.java
// public class SymbolSyntax extends Syntax<MumblerSymbol> {
// 	public SymbolSyntax(MumblerSymbol value, SourceSection source) {
// 		super(value, source);
// 	}
// }
// 
// Path: lang/src/main/java/mumbler/truffle/type/MumblerList.java
// public class MumblerList<T extends Object> implements Iterable<T> {
//     public static final MumblerList<?> EMPTY = new MumblerList<>();
// 
//     private final T car;
//     private final MumblerList<T> cdr;
//     private final int length;
// 
//     private MumblerList() {
//         this.car = null;
//         this.cdr = null;
//         this.length = 0;
//     }
// 
//     private MumblerList(T car, MumblerList<T> cdr) {
//         this.car = car;
//         this.cdr = cdr;
//         this.length = cdr.length + 1;
//     }
// 
//     @SafeVarargs
//     public static <T> MumblerList<T> list(T... objs) {
//         return list(asList(objs));
//     }
// 
//     public static <T> MumblerList<T> list(List<T> objs) {
//         @SuppressWarnings("unchecked")
//         MumblerList<T> l = (MumblerList<T>) EMPTY;
//         for (int i=objs.size()-1; i>=0; i--) {
//             l = l.cons(objs.get(i));
//         }
//         return l;
//     }
// 
//     public MumblerList<T> cons(T node) {
//         return new MumblerList<T>(node, this);
//     }
// 
//     public T car() {
//         if (this != EMPTY) {
//             return this.car;
//         }
//         throw new MumblerException("Cannot car the empty list");
//     }
// 
//     public MumblerList<T> cdr() {
//         if (this != EMPTY) {
//             return this.cdr;
//         }
//         throw new MumblerException("Cannot cdr the empty list");
//     }
// 
//     public long size() {
//         return this.length;
//     }
// 
//     @Override
//     public Iterator<T> iterator() {
//         return new Iterator<T>() {
//             private MumblerList<T> l = MumblerList.this;
// 
//             @Override
//             public boolean hasNext() {
//                 return this.l != EMPTY;
//             }
// 
//             @Override
//             public T next() {
//                 if (this.l == EMPTY) {
//                     throw new MumblerException("At end of list");
//                 }
//                 T car = this.l.car;
//                 this.l = this.l.cdr;
//                 return car;
//             }
// 
//             @Override
//             public void remove() {
//                 throw new MumblerException("Iterator is immutable");
//             }
//         };
//     }
// 
//     @Override
//     public boolean equals(Object other) {
//         if (!(other instanceof MumblerList)) {
//             return false;
//         }
//         if (this == EMPTY && other == EMPTY) {
//             return true;
//         }
// 
//         MumblerList<?> that = (MumblerList<?>) other;
//         if (this.cdr == EMPTY && that.cdr != EMPTY) {
//             return false;
//         }
//         return this.car.equals(that.car) && this.cdr.equals(that.cdr);
//     }
// 
//     @Override
//     public String toString() {
//         if (this == EMPTY) {
//             return "()";
//         }
// 
//         StringBuilder b = new StringBuilder("(" + this.car);
//         MumblerList<T> rest = this.cdr;
//         while (rest != null && rest != EMPTY) {
//             b.append(" ");
//             b.append(rest.car);
//             rest = rest.cdr;
//         }
//         b.append(")");
//         return b.toString();
//     }
// }


import mumbler.truffle.syntax.ListSyntax;
import mumbler.truffle.syntax.SymbolSyntax;
import mumbler.truffle.type.MumblerList;
                onList(list);
            }

            for (Syntax<?> sub : list.getValue()) {
                walk(sub);
            }

            switch (listType) {
            case DEFINE:
                onDefineExit(list);
                break;
            case LAMBDA:
                onLambdaExit(list);
                break;
            case IF:
                onIfExit(list);
                break;
            case QUOTE:
                onQuoteExit(list);
                break;
            case LIST:
                onListExit(list);
                break;
            }
        } else if (sexp instanceof SymbolSyntax) {
            onSymbol((SymbolSyntax) sexp);
        }
    }

    private boolean isListOf(String name, ListSyntax listSyntax) {
// Path: lang/src/main/java/mumbler/truffle/syntax/ListSyntax.java
// public class ListSyntax extends Syntax<MumblerList<? extends Syntax<?>>> {
//     public ListSyntax(MumblerList<? extends Syntax<?>> value,
//             SourceSection sourceSection) {
//         super(value, sourceSection);
//     }
// 
//     @Override
//     public Object strip() {
//         List<Object> list = new ArrayList<Object>();
//         for (Syntax<? extends Object> syntax : getValue()) {
//             list.add(syntax.strip());
//         }
//         return MumblerList.list(list);
//     }
// 
//     @Override
//     public String getName() {
//         if (super.getName() != null) {
//             return super.getName();
//         }
//         if (this.getValue().size() == 0) {
//             return "()";
//         }
//         return this.getValue().car().getValue().toString() + "-" + this.hashCode();
//     }
// }
// 
// Path: lang/src/main/java/mumbler/truffle/syntax/SymbolSyntax.java
// public class SymbolSyntax extends Syntax<MumblerSymbol> {
// 	public SymbolSyntax(MumblerSymbol value, SourceSection source) {
// 		super(value, source);
// 	}
// }
// 
// Path: lang/src/main/java/mumbler/truffle/type/MumblerList.java
// public class MumblerList<T extends Object> implements Iterable<T> {
//     public static final MumblerList<?> EMPTY = new MumblerList<>();
// 
//     private final T car;
//     private final MumblerList<T> cdr;
//     private final int length;
// 
//     private MumblerList() {
//         this.car = null;
//         this.cdr = null;
//         this.length = 0;
//     }
// 
//     private MumblerList(T car, MumblerList<T> cdr) {
//         this.car = car;
//         this.cdr = cdr;
//         this.length = cdr.length + 1;
//     }
// 
//     @SafeVarargs
//     public static <T> MumblerList<T> list(T... objs) {
//         return list(asList(objs));
//     }
// 
//     public static <T> MumblerList<T> list(List<T> objs) {
//         @SuppressWarnings("unchecked")
//         MumblerList<T> l = (MumblerList<T>) EMPTY;
//         for (int i=objs.size()-1; i>=0; i--) {
//             l = l.cons(objs.get(i));
//         }
//         return l;
//     }
// 
//     public MumblerList<T> cons(T node) {
//         return new MumblerList<T>(node, this);
//     }
// 
//     public T car() {
//         if (this != EMPTY) {
//             return this.car;
//         }
//         throw new MumblerException("Cannot car the empty list");
//     }
// 
//     public MumblerList<T> cdr() {
//         if (this != EMPTY) {
//             return this.cdr;
//         }
//         throw new MumblerException("Cannot cdr the empty list");
//     }
// 
//     public long size() {
//         return this.length;
//     }
// 
//     @Override
//     public Iterator<T> iterator() {
//         return new Iterator<T>() {
//             private MumblerList<T> l = MumblerList.this;
// 
//             @Override
//             public boolean hasNext() {
//                 return this.l != EMPTY;
//             }
// 
//             @Override
//             public T next() {
//                 if (this.l == EMPTY) {
//                     throw new MumblerException("At end of list");
//                 }
//                 T car = this.l.car;
//                 this.l = this.l.cdr;
//                 return car;
//             }
// 
//             @Override
//             public void remove() {
//                 throw new MumblerException("Iterator is immutable");
//             }
//         };
//     }
// 
//     @Override
//     public boolean equals(Object other) {
//         if (!(other instanceof MumblerList)) {
//             return false;
//         }
//         if (this == EMPTY && other == EMPTY) {
//             return true;
//         }
// 
//         MumblerList<?> that = (MumblerList<?>) other;
//         if (this.cdr == EMPTY && that.cdr != EMPTY) {
//             return false;
//         }
//         return this.car.equals(that.car) && this.cdr.equals(that.cdr);
//     }
// 
//     @Override
//     public String toString() {
//         if (this == EMPTY) {
//             return "()";
//         }
// 
//         StringBuilder b = new StringBuilder("(" + this.car);
//         MumblerList<T> rest = this.cdr;
//         while (rest != null && rest != EMPTY) {
//             b.append(" ");
//             b.append(rest.car);
//             rest = rest.cdr;
//         }
//         b.append(")");
//         return b.toString();
//     }
// }


// Path: lang/src/main/java/mumbler/truffle/parser/SexpListener.java
import mumbler.truffle.syntax.ListSyntax;
import mumbler.truffle.syntax.SymbolSyntax;
import mumbler.truffle.type.MumblerList;

                onList(list);
            }

            for (Syntax<?> sub : list.getValue()) {
                walk(sub);
            }

            switch (listType) {
            case DEFINE:
                onDefineExit(list);
                break;
            case LAMBDA:
                onLambdaExit(list);
                break;
            case IF:
                onIfExit(list);
                break;
            case QUOTE:
                onQuoteExit(list);
                break;
            case LIST:
                onListExit(list);
                break;
            }
        } else if (sexp instanceof SymbolSyntax) {
            onSymbol((SymbolSyntax) sexp);
        }
    }

    private boolean isListOf(String name, ListSyntax listSyntax) {
        MumblerList<? extends Syntax<?>> list = listSyntax.getValue();