module fors { trait Person { val name: String; val age: Int; } 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; def divisors(n: Int): List[Int] = for (val i <- List.range(1, n); 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 = (0.0 foldl_: xs) { (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( 'book('title("Structure and Interpretation of Computer Programs"), 'author("Abelson, Harald"), 'author("Sussman, Gerald J.")), 'book('title("Principles of Compiler Design"), 'author("Aho, Alfred"), 'author("Ullman, Jeffrey")), 'book('title("Programming in Modula-2"), 'author("Wirth, Niklaus"))); def findAuthor(books: Lst) = for (val 'book(book: Lst) <- books; val 'title(title: String) <- book; (title indexOf "Program") >= 0; val 'author(author: String) <- book) yield author; for (val 'book(b: Lst) <- books; val 'author(author: String) <- b; author startsWith "Ullman"; val 'title(title: String) <- b) yield title; removeDuplicates( for (val 'book(b1: Lst) <- books; val 'book(b2: Lst) <- books; b1 != b2; val 'author(a1: String) <- b1; val 'author(a2: String) <- b2; a1 == a2) yield Pair(a1, a2)); def removeDuplicates[a](xs: List[a]): List[a] = xs.head :: removeDuplicates(for (val x <- xs.tail; x != xs.head) yield x) }