/* * Copyright (c) 1999-2003, Gene Cooperman; Rights to copy and distribute * for non-commercial purposes only are freely granted, but only as * long as this copyright statement remains. No warranty is implied. */ final class Add extends BuiltInFunction { static final private String name = "+"; static final private int numArgs = 2; SchemeObject function (SchemeObject arg1, SchemeObject arg2) { return new Fixnum( ((Fixnum)arg1).value + ((Fixnum)arg2).value ); } // Ordering important. Define name, numArgs before super(name, numArgs) private Add() { super(name, numArgs); } private static final Add INSTANCE = new Add(); static void install() { } // dummy function to force creation of class } final class Subtract extends BuiltInFunction { static final private String name = "-"; static final private int numArgs = 2; SchemeObject function (SchemeObject arg1, SchemeObject arg2) { return new Fixnum( ((Fixnum)arg1).value - ((Fixnum)arg2).value ); } // Ordering important. Define name, numArgs before super(name, numArgs) private Subtract() { super(name, numArgs); } private static final Subtract INSTANCE = new Subtract(); static void install() { } // dummy function to force creation of class } final class SetBang extends SpecialFunction { static final private String name = "set!"; static final private int numArgs = 2; SchemeObject function (SchemeObject arg1, SchemeObject arg2) { if ( ! (arg1 instanceof Symbol) ) throw new SchemeError("set!: first arg is not a symbol"); SchemeObject tmp = arg2.eval(); ((Symbol)arg1).setValue( tmp ); return tmp; } // Ordering important. Define name, numArgs before super(name, numArgs) private SetBang() { super(name, numArgs); } private static final SetBang INSTANCE = new SetBang(); static void install() { } // dummy function to force creation of class } final class Define extends SpecialFunction { static final private String name = "define"; static final private int numArgs = 2; SchemeObject function (SchemeObject arg1, SchemeObject arg2) { if ( ! (arg1 instanceof Symbol) ) throw new SchemeError("define: first arg is not a symbol"); SchemeObject tmp = arg2.eval(); ((Symbol)arg1).setValue( tmp ); return tmp; } // Ordering important. Define name, numArgs before super(name, numArgs) private Define() { super(name, numArgs); } private static final Define INSTANCE = new Define(); static void install() { } // dummy function to force creation of class } final class Quote extends SpecialFunction { static private final String name = "quote"; static private final int numArgs = 1; SchemeObject function (SchemeObject arg1) { return arg1; } // Ordering important. Define name, numArgs before super(name, numArgs) private static final Quote INSTANCE = new Quote(); private Quote() { super(name, numArgs); } static void install() { } // dummy function to force creation of class } final class Eval extends BuiltInFunction { static private final String name = "eval"; static private final int numArgs = 1; SchemeObject function (SchemeObject arg1) { try { return arg1.eval(); } catch ( SchemeError se ) { throw new Error("(eval " + arg1 + "): bad arg"); } } // Ordering important. Define name, numArgs before super(name, numArgs) private static final Eval INSTANCE = new Eval(); private Eval() { super(name, numArgs); } static void install() { } // dummy function to force creation of class } final class Print extends BuiltInFunction { static private final String name = "print"; static private final int numArgs = 1; SchemeObject function (SchemeObject arg1) { System.out.print( arg1 ); return Symbol.schemeNil; } // Ordering important. Define name, numArgs before super(name, numArgs) private static final Print INSTANCE = new Print(); private Print() { super(name, numArgs); } static void install() { } // dummy function to force creation of class } final class Exit extends BuiltInFunction { static private final String name = "exit"; static private final int numArgs = 0; SchemeObject function () { System.exit(0); return null; } // Ordering important. Define name, numArgs before super(name, numArgs) private static final Exit INSTANCE = new Exit(); private Exit() { super(name, numArgs); } static void install() { } // dummy function to force creation of class } final class EqualNumber extends BuiltInFunction { static private final String name = "="; static private final int numArgs = 2; SchemeObject function ( SchemeObject x, SchemeObject y ) { if ( ! (x instanceof Fixnum) || ! (y instanceof Fixnum) ) throw new SchemeError("=: arguments must be fixnums"); return ( ((Fixnum)x).value == ((Fixnum)y).value ? Symbol.schemeTrue : Symbol.schemeFalse ); } // Ordering important. Define name, numArgs before super(name, numArgs) private static final EqualNumber INSTANCE = new EqualNumber(); private EqualNumber() { super(name, numArgs); } static void install() { } // dummy function to force creation of class } // To generalize to if with 2 or 3 args, set numArgs to -1 final class If extends SpecialFunction { static private final String name = "if"; static private final int numArgs = -1; SchemeObject function ( SchemeObject args ) { if ( args.length() < 2 || args.length() > 3 ) throw new SchemeError("if: Called with " + args.length() + " args; should be called with 2 or 3 args"); if ( args.car().eval() == Symbol.schemeTrue ) return args.cdr().car().eval(); else if ( args.cdr().cdr() != Symbol.schemeNil ) return args.cdr().cdr().car().eval(); else return Symbol.schemeFalse; } // Ordering important. Define name, numArgs before super(name, numArgs) private static final If INSTANCE = new If(); private If() { super(name, numArgs); } static void install() { } // dummy function to force creation of class } final class Lambda extends SpecialFunction { static private final String name = "lambda"; static private final int numArgs = -1; SchemeObject function (SchemeObject arg1) { return new LambdaSymbol(arg1.car(), arg1.cdr()); //return LambdaFnc.function(arg1); } // Ordering important. Define name, numArgs before super(name, numArgs) private static final Lambda INSTANCE = new Lambda(); private Lambda() { super(name, numArgs); } static void install() { } // dummy function to force creation of class } final class LambdaFnc extends BuiltInFunction { static private String name = "lambdafnc"; static private int numArgs = -1; private SchemeObject arg = null; private SchemeObject body = null; SchemeObject function (SchemeObject args) { this.arg = args.car(); this.body = args.cdr(); System.out.println("lf "+arg+" "+body); return new LambdaSymbol(arg, body); } // Ordering important. Define name, numArgs before super(name, numArgs) private static final LambdaFnc INSTANCE = new LambdaFnc(); private LambdaFnc() { super(name, numArgs); } static void install() { } // dummy function to force creation of class } /* final class LambdaBegin extends OrdinaryFunction { static private final String name = "lambdabegin"; static private final int numArgs = 1; protected SchemeObject value = null; SchemeObject function (SchemeObject arg1) { System.out.println("LambdaBegin called "+arg1); this.value = arg1; return arg1; } // Ordering important. Define name, numArgs before super(name, numArgs) private static final LambdaBegin INSTANCE = new LambdaBegin(); private LambdaBegin() { super(name, numArgs); } static void install() { } // dummy function to force creation of class } //*/ final class Eq extends BuiltInFunction { static final private String name = "eq?"; static final private int numArgs = 2; SchemeObject function (SchemeObject arg1, SchemeObject arg2) { if (arg1 == arg2) return Symbol.schemeTrue; else return Symbol.schemeFalse; } // Ordering important. Define name, numArgs before super(name, numArgs) private Eq() { super(name, numArgs); } private static final Eq INSTANCE = new Eq(); static void install() { } // dummy function to force creation of class } final class Begin extends BuiltInFunction { static final private String name = "begin"; static final private int numArgs = -1; SchemeObject function (SchemeObject args) { SchemeObject returnval = null; int i = 0; while(i < args.length()) { returnval = args.nth(i).eval(); i++; } i--; return returnval; } // Ordering important. Define name, numArgs before super(name, numArgs) private Begin() { super(name, numArgs); } private static final Begin INSTANCE = new Begin(); static void install() { } // dummy function to force creation of class } final class GreaterNumber extends BuiltInFunction { static private final String name = ">"; static private final int numArgs = 2; SchemeObject function ( SchemeObject x, SchemeObject y ) { if ( ! (x instanceof Fixnum) || ! (y instanceof Fixnum) ) throw new SchemeError(">: arguments must be fixnums"); return ( ((Fixnum)x).value > ((Fixnum)y).value ? Symbol.schemeTrue : Symbol.schemeFalse ); } // Ordering important. Define name, numArgs before super(name, numArgs) private static final GreaterNumber INSTANCE = new GreaterNumber(); private GreaterNumber() { super(name, numArgs); } static void install() { } // dummy function to force creation of class } final class Car extends SpecialFunction { static private final String name = "car"; static private final int numArgs = 1; SchemeObject function ( SchemeObject arg ) { return arg.car(); } // Ordering important. Define name, numArgs before super(name, numArgs) private static final Car INSTANCE = new Car(); private Car() { super(name, numArgs); } static void install() { } // dummy function to force creation of class } final class Cdr extends SpecialFunction { static private final String name = "cdr"; static private final int numArgs = 1; SchemeObject function ( SchemeObject arg ) { return arg.cdr(); } // Ordering important. Define name, numArgs before super(name, numArgs) private static final Cdr INSTANCE = new Cdr(); private Cdr() { super(name, numArgs); } static void install() { } // dummy function to force creation of class }