
class List
{
    private Object car = null;
    private List cdr = null;

    List(Object car, List cdr)
    {   this.car = car; this.cdr = cdr;   }

    Object car()
    {   return this.car;   }

    List cdr()
    {   return this.cdr;   }

    boolean isNull()
    {
	return ((null == this.car) 
		&& (null == this.cdr) );
    }

    public String toString()
    {
	String s = "(";
	if (null != this.car)
	    {
		s = s + this.car;
		if (null != this.cdr)
		    {
			s = s + " . " + cdr;
		    }
	    }
	return s + ")";
    }

    public static void main (String[] args)
    {
	List lst = new List("foo",
			  new List("bar",
				   new List("baz",
					    null)));
	System.out.println("lst = " +lst);
	System.out.println("car = " +lst.car());
	System.out.println("cdr = " +lst.cdr());

	System.out.println("is_member_iter(\"bar\","
		 + " lst) = " +
		 Member.is_member_iter("bar", lst));
	System.out.println("is_member(\"bar\","
		 + " lst) = " +
		 Member.is_member("bar", lst));
	System.out.println("is_member_iter(\"fum\","
		 + " lst) = " +
		 Member.is_member_iter("fum", lst));
	System.out.println("is_member(\"fum\","
		 + " lst) = " +
		 Member.is_member("fum", lst));

	System.out.println("rember(\"foo\", lst) = "
		     + Member.rember("foo",lst));
	System.out.println("rember(\"bar\", lst) = "
		     + Member.rember("bar",lst));
	System.out.println("rember(\"baz\", lst) = "
		     + Member.rember("baz",lst));
	System.out.println("rember(\"fum\", lst) = "
		     + Member.rember("fum",lst));
    }
}

class Member
{
    static Boolean is_member_iter(Object a, List lob)
    {
	while (null != lob)
	    {
		if (a.equals(lob.car()))
		    return new Boolean(true);
		else
		    lob = lob.cdr();
	    }
	return new Boolean(false);
    }

    static Boolean is_member(Object a, List lob)
    {
	if (null == lob)
	    return new Boolean(false);
	else
	    if (a.equals(lob.car()))
		return new Boolean(true);
	    else
		return is_member(a, lob.cdr());
    }

    static List rember(Object a, List lob)
    {
	if (null == lob)
	    return null;
	else
	    if (a.equals(lob.car()))
		return lob.cdr();
	    else
		return new List(lob.car(),
				rember(a, lob.cdr()));
    }

}

