My head hurts...
interface ListVisitorI {
ListD forEmpty();
ListD forValue(Object v, ListD rest); }
abstract class ListD {
abstract int getLength();
abstract ListD accept(ListVisitorI ask); }
class EmptyList extends ListD {
int getLength() {
return 0; }
ListD accept(ListVisitorI func) {
return func.forEmpty(); } }
class ValueList extends ListD {
Object v;
ListD p;
ValueList(Object _v, ListD _p) {
v = _v;
p = _p; }
int getLength() {
return 1 + p.getLength(); }
ListD accept(ListVisitorI func) {
return func.forValue(v, p); } }
class SubstV implements ListVisitorI {
Object newv;
Object old;
SubstV(Object _old, Object _newv) {
old = _old;
newv = _newv; }
public ListD forEmpty() {
return new EmptyList(); }
public ListD forValue(Object f, ListD rest) {
if (f.equals(old))
return new ValueList(newv, rest.accept(this));
else
return new ValueList(f, rest.accept(this)); } }
class PrintV implements ListVisitorI {
public ListD forEmpty() {
System.out.println("nil");
return new EmptyList(); // Ezt csak így ideraktam.
}
public ListD forValue(Object f, ListD rest) {
System.out.print(f);
System.out.print(" ");
return rest.accept(this); } }
class Main {
public static void main(String args[]) {
System.out.println(
new ValueList(new Integer(1),
new ValueList(new Integer(2),
new EmptyList()))
.getLength());
new ValueList(new Integer(1),
new ValueList(new Integer(2),
new ValueList(new Integer(4),
new ValueList(new Integer(2),
new EmptyList()))))
.accept(new SubstV(new Integer(2), new Integer(3)))
.accept(new PrintV()); } }