racket/collects/honu/examples/old/Fact-Integer.honu
Stevie Strickland 7dbb99d3c6 merged 292:296 from branches/sstrickl
svn: r297
2005-07-02 04:03:02 +00:00

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();
}