summaryrefslogblamecommitdiff
path: root/sources/examples/fors.scala
blob: fe946f7b0b2cd069a12bc33260c35377383eefbc (plain) (tree)
1
2
3
4
5
6
7

                 
             
 


                                          







                                                                




                             
                                   
                                                          








                                                  
                                        






                                                      



















                                                                         

                              

                                                 
                                        
                                                                 
 

                                               
                                  
                                                         

                   

                                             
                  

                                             


                                                 















                                                                                
                                 


                                            
                                 



                                                        
 
package examples;

object fors {

  class Person(_name: String, _age: Int) {
    val name = _name;
    val age = _age;
  }

  def printOlderThan20(xs: Seq[Person]): Iterator[String] =
    printOlderThan20(xs.elements);

  def printOlderThan20(xs: Iterator[Person]): Iterator[String] =
    for (val p <- xs; p.age > 20) yield p.name;

  val persons = List(
    new Person("John", 40),
    new Person("Richard", 68)
  );

  def divisors(n: Int): List[Int] =
    for (val i <- List.range(1, n+1); n % i == 0) yield i;

  def isPrime(n: Int) = divisors(n).length == 2;

  def findNums(n: Int): Iterator[Pair[Int, Int]] =
    for (val i <- Iterator.range(1, n);
         val j <- Iterator.range(1, i-1);
         isPrime(i+j)) yield Pair(i, j);

  def sum(xs: List[Double]): Double =
    xs.foldLeft(0.0) { (x, y) => x + y }

  def scalProd(xs: List[Double], ys: List[Double]) =
    sum(for(val Pair(x, y) <- xs zip ys) yield x * y);

  type Lst = List[Any];

  val books = List(
    Elem("book",
         Elem("title",
              Text("Structure and Interpretation of Computer Programs")),
         Elem("author",
              Text("Abelson, Harald")),
         Elem("author",
              Text("Sussman, Gerald J."))),
    Elem("book",
         Elem("title",
              Text("Principles of Compiler Design")),
         Elem("author",
              Text("Aho, Alfred")),
         Elem("author",
              Text("Ullman, Jeffrey"))),
    Elem("book",
         Elem("title",
              Text("Programming in Modula-2")),
	 Elem("author",
              Text("Wirth, Niklaus")))
  );

  def findAuthor(books: Lst) =
    for (val Elem("book",book @ _*) <- books;
         val Elem("title",Text( title )) <- book;
         (title indexOf "Program") >= 0;
         val Elem("author",Text( author )) <- book) yield author;

  for (val Elem("book", b @ _*) <- books;
       val Elem("author", Text( author )) <- b;
       author startsWith "Ullman";
       val Elem("title",Text( title )) <- b) yield title;

  removeDuplicates(
    for (val Elem("book", b1 @ _* ) <- books;
         val Elem("book", b2 @ _*) <- books;
	 b1 != b2;
	 val Elem("author",Text( a1 )) <- b1;
	 val Elem("author",Text( a2 )) <- b2;
	 a1 == a2) yield Pair(a1, a2));

  def removeDuplicates[a](xs: List[a]): List[a] =
    if (xs.isEmpty)
      xs
    else
      xs.head :: removeDuplicates(for (val x <- xs.tail; x != xs.head) yield x);

  def main(args: Array[String]) = {
    Console.print("Persons over 20:");
    printOlderThan20(persons) foreach { x => Console.print(" " + x) };
    Console.println;

    Console.println("divisors(34) = " + divisors(34));

    Console.print("findNums(15) =");
    findNums(15) foreach { x => Console.print(" " + x); };
    Console.println;

    val xs = List(3.5, 5.0, 4.5);
    Console.println("average(" + xs + ") = "
      + sum(xs) / xs.length);

    val ys = List(2.0, 1.0, 3.0);
    Console.println("scalProd(" + xs + ", " + ys +") = "
      + scalProd(xs, ys));
  }

}