class List { Int isEmpty() { return this.isEmpty() } Int head() { return this.head() } List tail() { return this.tail() } List cons(Int x) { return this.cons(x) } } class Cons extends List { Int head; List tail; Int isEmpty() { return false } Int head() { return this.head } List tail() { return this.tail } List cons(Int x) { return new Cons(x, this) } } class Nil extends List { Int isEmpty() { return true } List cons(Int x) { return new Cons(x, this) } } class String { // print a string Null print(List l) { while(!l.isEmpty()) { printChar(l.head()); l = l.tail(); } } // print a string with \n Null println(List l) { this.print(l); printChar(10); } // returns the length of a string Int length(List l) { Int len = 0; while(!l.isEmpty()) { len = len+1; l = l.tail(); } return len } // reverse a string List reverse(List l) { List rev = new Nil(); while(!l.isEmpty()) { rev = new Cons(l.head(), rev); l = l.tail(); } return rev } // return the substring from start to end (without) List substring(List l, Int start, Int end) { Int len = end - start; List result = new Nil(); while(start > 0) { l = l.tail(); start = start-1; } while(len > 0) { result = new Cons(l.head(), result); l = l.tail(); len = len-1; } return this.reverse(result) } // reads a string from the console List readString() { List res = new Nil(); Int c = readChar; while(c != 10) { res = new Cons(c, res); c = readChar; } return this.reverse(res) } // compare two strings Int eq(List l1, List l2) { Int cont = true; Int eq = true; while(cont) { if(l1.isEmpty() && l2.isEmpty()) { cont = false; } else { if(l1.isEmpty() || l2.isEmpty()) { cont = false; eq = false; } else { if(l1.head() != l2.head()) { eq = false; cont = false; } else { l1 = l1.tail(); l2 = l2.tail(); }; }; }; } return eq } } class Names extends String { Null printWelcome() { this.println("*************************"); this.println("*** Play with strings ***"); this.println("*************************"); } List askName(List ask) { this.print(" "); this.println(ask); this.print(" ->"); List name = this.readString(); this.print(" OK, the name is "); this.println(name); return name } Null main() { this.printWelcome(); List name1 = this.askName("What is your name?"); List name2 = this.askName("And your brother's?"); this.print(" The names are: "); this.println(if(this.eq(name1, name2)) "equals ;-)" else "different :-0"); this.print(" Your name begins with: "); this.println(this.substring(name1, 0, 1)); this.print(" Brother's name reversed: "); this.println(this.substring(this.reverse(name2), 1, this.length(this.reverse(name2)))); } } class Real { Int left; Int right; Null print() { printInt(this.left); new String().print("."); printInt(this.right); } Real normalize() { Real r = this; Int cont = true; while(cont) { cont = r.right > 0; cont = if(cont) r.right % 10 == 0 else false; r = if(cont) new Real(r.left, r.right / 10) else r; } return r } Int length() { Int l = 1; Int div = 10; while(this.right / div > 0) { l = l+1; div = div*10; } l = if(this.right % 10 == 0) l-1 else l; return l } Int max(Int i1, Int i2) { return if(i1 > i2) i1 else i2 } Int min(Int i1, Int i2) { return if(i1 < i2) i1 else i2 } Real sum(Real that) { Real thiz = this; Int lenMax = this.max(this.right, that.right); Int lenMin = this.min(this.right, that.right); Int diff = new Real(0, lenMax).length() - new Real(0, lenMin).length(); Int factor = 1; while(diff > 0) { factor = factor*10; diff = diff-1; } if(this.right > that.right) { that = new Real(that.left, that.right * factor); } else { thiz = new Real(this.left, this.right * factor); }; Int Tleft = thiz.left + that.left; Int Tright = thiz.right + that.right; Real result = new Real(Tleft, Tright).normalize(); return result } } class Reals { Real readReal() { String s = new String(); s.println(" Type a real"); s.print(" ->"); Int left = readInt; s.print(" ->"); printInt(left); s.print("."); Int right = readInt; Real r = new Real(left, right).normalize(); s.print(" got "); r.print(); s.println(""); return r } Null main() { String s = new String(); s.println("*************************"); s.println("**** Play with reals ****"); s.println("* With some limitations *"); s.println("*************************"); Real r1 = this.readReal(); Real r2 = this.readReal(); s.print(" The sum is "); r1.sum(r2).print(); s.println(""); } } class Compop extends String { Null test() { Int i = 0; this.println(" ------------------------"); this.println(" -> test == and !="); this.println(" ------------------------"); i = 10; this.println(" Print 10"); this.print(" "); while(i == 10) { printInt(i); this.print(" "); i = i+1; } this.println(""); this.println(""); i = 10; this.println(" Print 10..1"); this.print(" "); while(i != 0) { printInt(i); this.print(" "); i = i-1; } this.println(""); this.println(""); this.println(" ------------------------"); this.println(" -> test < and >"); this.println(" ------------------------"); i = 0; this.println(" Print 0..9"); this.print(" "); while(i < 10) { printInt(i); this.print(" "); i = i+1; } this.println(""); this.println(""); i = 10; this.println(" Print 10..1"); this.print(" "); while(i > 0) { printInt(i); this.print(" "); i = i-1; } this.println(""); this.println(""); this.println(" ------------------------"); this.println(" -> test <= and =>"); this.println(" ------------------------"); i = 0; this.println(" Print 0..10"); this.print(" "); while(i <= 10) { printInt(i); this.print(" "); i = i+1; } this.println(""); this.println(""); i = 10; this.println(" Print 10..0"); this.print(" "); while(i >= 0) { printInt(i); this.print(" "); i = i-1; } this.println(""); this.println(""); this.println(" ------------------------"); this.println(" -> test !== and !!="); this.println(" ------------------------"); i = 20; this.println(" Print 20..11"); this.print(" "); while(!(i == 10)) { printInt(i); this.print(" "); i = i-1; } this.println(""); this.println(""); i = 0; this.println(" Print 0"); this.print(" "); while(!(i != 0)) { printInt(i); this.print(" "); i = i+1; } this.println(""); this.println(""); this.println(" ------------------------"); this.println(" -> test !< and !>"); this.println(" ------------------------"); i = 20; this.println(" Print 20..10"); this.print(" "); while(!(i < 10)) { printInt(i); this.print(" "); i = i-1; } this.println(""); this.println(""); i = -10; this.println(" Print -10..0"); this.print(" "); while(!(i > 0)) { printInt(i); this.print(" "); i = i+1; } this.println(""); this.println(""); this.println(" ------------------------"); this.println(" -> test !<= and !>="); this.println(" ------------------------"); i = 20; this.println(" Print 20..11"); this.print(" "); while(!(i <= 10)) { printInt(i); this.print(" "); i = i-1; } this.println(""); this.println(""); i = -10; this.println(" Print -10..-1"); this.print(" "); while(!(i >= 0)) { printInt(i); this.print(" "); i = i+1; } this.println(""); this.println(""); } Null main() { this.println("*************************"); this.println("*** Play with Compop ***"); this.println("*************************"); this.test(); } } class Test { Int a; } { new Names().main(); printChar(10); new Reals().main(); printChar(10); new Compop().main(); }