object Test {
def fac(n: Int): Int = if (n < 2) 1 else fac(n - 1) * n;
// Fibonacci
def fib(n: Int): Int = if (n < 2) 1 else fib(n - 1) + fib(n - 2);
def show_fib(n: Int): Int = {
Console.print("### fib(");
Console.print(n);
Console.print(") = ");
Console.flush;
val v = fib(n);
Console.print(v);
Console.println;
Console.flush;
v
}
def id[X](x: X): X = x;
def apply[X](f: X => X, x: X): X = f(x);
def id_obj(x: AnyRef): AnyRef = x;
def apply_obj(f: AnyRef => AnyRef, x: AnyRef): AnyRef = f(x);
def id_any(x: scala.Any): scala.Any = x;
def apply_any(f: scala.Any => scala.Any, x: scala.Any): scala.Any = f(x);
def id_int(x: Int): Int = x;
def apply_int(f: Int => Int, x: Int): Int = f(x);
class MyClass() {
override def toString() = "=== MyClass::toString ===";
def test() = Console.println("=== MyClass::test ===");
}
class MySubclass() extends MyClass() {
override def toString() = "=== MySubclass::toString ===";
}
def foobar = {
42;
42l;
23.5f;
23.5;
"Hello";
32 + 45;
// !!! System
// java; // !!! why is this legal ? what does it return ?
// java.lang;
//System.out;
Console.println("### Hello");
Console.print("### ");
Console.println(17);
Console.println("### Bye");
Console.println;
val x = 13;
x;
// !!! why are DefDef replaced by Block(Tree[0])? we should use Empty!
def f = 19;
f;
def f0() = 11;
f0();
def f1(x: Int) = x;
f1(7);
def f2(x: Int, y: Int) = x + y;
f2(3,5);
def f11(x: Int)(y: Int) = x + y;
f11(23)(2);
1 < 2;
if (1 < 2) 3 else 4;
show_fib(0);
show_fib(1);
show_fib(2);
show_fib(3);
show_fib(4);
// !!! show_fib(id[Int](4));
/*
show_fib(5);
show_fib(6);
show_fib(7);
show_fib(8);
show_fib(9);
show_fib(10);
show_fib(11);
show_fib(12);
*/
val myObj = new MyClass();
Console.println(myObj);
val mySub = new MySubclass();
Console.println(mySub);
myObj.test();
Console.println;
Console.println(apply_any(id_any, "identity").toString());
Console.println;
};
foobar;
//############################################################################
class A(a: Int) {
def getA = a;
}
class B(b: Int, c: Int) extends A(b + c) {
def getB = b;
}
class X(x: Int) {
def getX = x;
}
case class Y(y: Int, z: Int) extends X(y + z) {
def getY = y;
def getAA = this.y;
}
{
val a: A = new A(1);
val b: B = new B(2,3);
val x: X = new X(4);
val y: Y = new Y(5,6);
Console.println("A.a = " + a.getA);
Console.println("B.a = " + b.getA);
Console.println("B.b = " + b.getB);
Console.println;
Console.println("X.a = " + x.getX);
Console.println("Y.a = " + y.getX);
Console.println("Y.b = " + y.getY);
Console.println("Y.b = " + y.y);
Console.println;
}
//############################################################################
{
class X() {
def foo = {
Console.println("X::foo");
}
}
class Y() extends X() {
override def foo = {
Console.println("Y::foo");
super.foo;
}
}
val x: X = new X();
val y: X = new Y();
x.foo;
Console.println;
y.foo;
Console.println;
}
//############################################################################
{
class X() {}
class O(a: Int) {
case class Y(b: Int) extends X() {
override def toString() = "";
def bar = a + b;
}
def foo = Y(2).bar
}
Console.println(new O(1).foo)
}
{
class O(a: Int) {
class X() {}
case class Y(b: Int) extends X() {
override def toString() = "";
def bar = a + b;
}
def foo = Y(2).bar
}
Console.println(new O(1).foo)
}
Console.println;
case class Bar();
case class Foo(i: Int, j: Char, c: Bar) ;
Console.println(
true // Foo(3,'a',Bar()).caseElement( -1 ) == null // throws Exception now
&& Foo(3,'a',Bar()).productElement( 0 ) == 3
&& Foo(3,'a',Bar()).productElement( 1 ) == 'a'
&& Foo(3,'a',Bar()).productElement( 2 ) == Bar()
&& true // Foo(3,'a',Bar()).caseElement( 3 ) == null // throws Exception now
&& Bar().productArity == 0
&& Foo(3,'a',Bar()).productArity == 3);
//############################################################################
def main(args: Array[String]) {
}
//############################################################################
}