79 lines
1.5 KiB
Plaintext
79 lines
1.5 KiB
Plaintext
type Integer {
|
|
int value;
|
|
|
|
Integer succ();
|
|
Integer plus(Integer y);
|
|
Integer times(Integer y);
|
|
}
|
|
|
|
type IFact {
|
|
Integer fact();
|
|
}
|
|
|
|
class Zero() : Integer impl Integer, IFact {
|
|
|
|
int value = 0;
|
|
|
|
Integer plus(Integer y) {
|
|
return y;
|
|
}
|
|
|
|
Integer times(Integer y) {
|
|
return (this : Integer);
|
|
}
|
|
|
|
Integer succ() {
|
|
return new Positive : Integer(pred = (this : Integer));
|
|
}
|
|
|
|
Integer fact() {
|
|
return new Positive : Integer(pred = (this : Integer));
|
|
}
|
|
|
|
export Integer : value, plus, times, succ;
|
|
|
|
export IFact : fact;
|
|
}
|
|
|
|
class Positive() : Integer impl Integer, IFact {
|
|
|
|
init Integer pred;
|
|
|
|
int value = pred.value + 1;
|
|
|
|
Integer plus(Integer y) {
|
|
return pred.plus(y.succ());
|
|
}
|
|
|
|
Integer times(Integer y) {
|
|
return pred.times(y).plus(y);
|
|
}
|
|
|
|
Integer succ() {
|
|
return new Positive : Integer(pred = (this : Integer));
|
|
}
|
|
|
|
Integer fact() {
|
|
return times((pred : IFact).fact());
|
|
}
|
|
|
|
export Integer : value, plus, times, succ;
|
|
export IFact : fact;
|
|
}
|
|
|
|
Integer main(){
|
|
Integer zero = new Zero : Integer();
|
|
Integer one = new Positive : Integer(pred = zero);
|
|
Integer two = new Positive : Integer(pred = one);
|
|
Integer three = one.plus(two);
|
|
Integer four = two.times(two);
|
|
Integer five = four.plus(one);
|
|
Integer six = two.plus(four);
|
|
Integer seven = one.plus(two.plus(four));
|
|
Integer eight = two.times(two);
|
|
Integer nine = three.times(three);
|
|
Integer ten = nine.plus(one);
|
|
|
|
return (five : IFact).fact();
|
|
}
|