/** * Copyright (c): Uwe Schmidt, FH Wedel * * You may study, modify and distribute this source code * FOR NON-COMMERCIAL PURPOSES ONLY. * This copyright message has to remain unchanged. * * Note that this document is provided 'as is', * WITHOUT WARRANTY of any kind either expressed or implied. */ /** * eine Klasse SExpr fuer die Implementierung * von Lisp Werten */ //-------------------- public abstract class SExpr { //-------------------- // der Wert fuer NIL public final static SExpr nil = new Nil(); //-------------------- // der Wert fuer #t (true) public final static SExpr t = new Symbol("#t"); //-------------------- // // Konstruktor Funktionen public static SExpr mkSymbol(String s) { if (s.equals("#t")) return t; return new Symbol(s); } public static SExpr mkNumber(long n) { return new Number(n); } public static SExpr mkPair(SExpr l, SExpr r) { return l.cons(r); } //-------------------- // die Selektoren public SExpr car() { throw new IllegalArgumentException("car applied to an atom"); } public SExpr cdr() { throw new IllegalArgumentException("cdr applied to an atom"); } //-------------------- // verknuepfen 2-er SExpr public SExpr cons(SExpr e2) { return new Pair(this, e2); } //-------------------- // elementare Praedikate // alle Praedikate liefern als // default Resultat false (NIL) public SExpr isAtom() { return nil; } public SExpr isPair() { return nil; } public SExpr isList() { return nil; } // Test gegen NIL public SExpr isNull() { return this == nil ? t : nil; } // Test auf gleiche Struktur public SExpr isEqual(SExpr e2) { return nil; } }