Buggy code:
if ( v1 == null ) { for ( int i = 1 ; i < ( args . size ( ) ) ; i ++ ) { Object v2 = args . get ( i ) ; if ( v2 != null ) return true ; } } else { for ( int i = 1 ; i < ( args . size ( ) ) ; i ++ ) { Object v2 = args . get ( i ) ; if ( ! ( v1 . equals ( v2 ) ) ) return true ; } } return false ; } } static class _lt extends Fn { public Object invoke ( ArrayList < Object > args ) throws Throwable { for ( int i = 0 ; i < ( ( args . size ( ) ) - 1 ) ; i ++ ) { Object first = args . get ( i ) ; Object second = args . get ( ( i + 1 ) ) ; if ( ! ( ( Core . doubleValue ( first ) ) < ( Core . doubleValue ( second ) ) ) ) return false ; } return true ; } } static class _gt extends Fn { public Object invoke ( ArrayList < Object > args ) throws Throwable { for ( int i = 0 ; i < ( ( args . size ( ) ) - 1 ) ; i ++ ) { Object first = args . get ( i ) ; Object second = args . get ( ( i + 1 ) ) ; if ( ! ( ( Core . doubleValue ( first ) ) > ( Core . doubleValue ( second ) ) ) ) return false ; } return true ; } } static class _lt_eq extends Fn { public Object invoke ( ArrayList < Object > args ) throws Throwable { for ( int i = 0 ; i < ( ( args . size ( ) ) - 1 ) ; i ++ ) { Object first = args . get ( i ) ; Object second = args . get ( ( i + 1 ) ) ; if ( ! ( ( Core . doubleValue ( first ) ) <= ( Core . doubleValue ( second ) ) ) ) return false ; } return true ; } } static class _gt_eq extends Fn { public Object invoke ( ArrayList < Object > args ) throws Throwable { for ( int i = 0 ; i < ( ( args . size ( ) ) - 1 ) ; i ++ ) { Object first = args . get ( i ) ; Object second = args . get ( ( i + 1 ) ) ; if ( ! ( ( Core . doubleValue ( first ) ) >= ( Core . doubleValue ( second ) ) ) ) return false ; } return true ; } } static class not extends Fn { public Object invoke ( ArrayList < Object > args ) throws Throwable { return ! ( Core . booleanValue ( args . get ( 0 ) ) ) ; } } static class read_string extends Fn { public Object invoke ( ArrayList < Object > args ) throws Throwable { return Core . parse ( new StringReader ( ( ( String ) ( args . get ( 0 ) ) ) ) ) ; } } static class type extends Fn { public Object invoke ( ArrayList < Object > args ) throws Throwable { return Core . type ( args . get ( 0 ) ) ; } } static class eval extends Fn { public Object invoke ( ArrayList < Object > args ) throws Throwable { <START_BUG> return Core . preprocessEval ( args . get ( 0 ) , globalEnv ) ; <END_BUG> } } static class fold extends Fn { public Object invoke ( ArrayList < Object > args ) throws Throwable { Object f = args . get ( 0 ) ; ArrayList < Object > lst = Core . arrayListValue ( args . get ( 1 ) ) ; Object acc = lst . get ( 0 ) ; ArrayList < Object > args2 = new ArrayList < Object > ( ) ; args2 . add ( null ) ; args2 . add ( null ) ; for ( int i = 1 ; i < ( lst . size ( ) ) ; i ++ ) { args2 . set ( 0 , acc ) ; args2 . set ( 1 , lst . get ( i ) ) ; acc = Core . apply ( f , args2 ) ; } return acc ; } } static class map extends Fn { public Object invoke ( ArrayList < Object > args ) throws Throwable { Object f = args . get ( 0 ) ; ArrayList < Object > lst = Core . arrayListValue ( args . get ( 1 ) ) ; ArrayList < Object > acc = new ArrayList < Object > ( ) ; for ( int i = 0 ; i < ( lst . size ( ) ) ; i ++ ) { ArrayList < Object > args2 = new ArrayList < Object > ( ) ; args2 . add ( lst . get ( i ) ) ; acc . add ( Core . apply ( f , args2 ) ) ; } return acc ; } } static class apply extends Fn { public Object invoke ( ArrayList < Object > args ) throws Throwable { return Core . apply ( args . get ( 0 ) , Core . arrayListValue ( args . get ( 1 ) ) ) ;

Fix:
return Core . macroexpandEval ( args . get ( 0 ) , globalEnv ) ;