]]> ]]>

Scala for JVM

Реализация языка программирования Scala
  • Scala-программы во многом похожи на Java-программы, и могут свободно взаимодействовать с Java-кодом.
  • Scala включает единообразную объектную модель — в том смысле, что любое значение является объектом, а любая операция — вызовом метода.
  • Scala — это также функциональный язык в том смысле, что функции — это полноправные значения.
  • В Scala включены мощные и единообразные концепции абстракций как для типов, так и для значений.
  • Она содержит гибкие симметричные конструкции примесей для композиции классов и trait-ов.
  • Она позволяет производить декомпозицию объектов путем сравнения с образцом.
  • Образцы и выражения были обобщены для поддержки естественной обработки XML-документов.
  • В целом, эти конструкции позволяют легко выражать самостоятельные компоненты, использующие библиотеки Scala, не пользуясь специальными языковыми конструкциями.
  • Scala допускает внешние расширения компонентов с использованием видов (views)

Примеры:

Hello, World!:

Пример для версий Scala 2.5.1-final, Scala 2.7.7-final
object HelloWorld {
    def main(args: Array[String]) {
        println("Hello, World!")
    }
}

Факториал:

Пример для версий Scala 2.5.1-final, Scala 2.7.7-final

Используется рекурсивное определение факториала.

object Factorial {
    def factorial(n: Int): Long = 
        if (n == 0) 1 
               else n * factorial(n - 1)
    def main(args: Array[String]) {
        for {i <- List.range(0, 17)} 
            yield { println(i + "! = " + factorial(i)) }
    }
}

Числа Фибоначчи:

Пример для версий Scala 2.7.7-final

Используется рекурсивное определение чисел Фибоначчи.

object Fibonacci {
    def fibonacci(n: Int): Int = 
        if (n < 3) 1 
              else fibonacci(n - 1) + fibonacci(n - 2)
    def main(args: Array[String]) {
        for {i <- List.range(1, 17)} 
            yield { print(fibonacci(i) + ", ") }
        println("...")
    }
}

Факториал:

Пример для версий Scala 2.7.7-final

Используется итеративное определение факториала.

object Factorial {
    def main(args: Array[String]) {
        var f = BigInt(1)
        format("0! = %s\n", f)
        for {i <- 1 to 16} {
             f *= i;
             format("%s! = %s\n", i, f)
        }
    }
}

Числа Фибоначчи:

Пример для версий Scala 2.7.7-final

Этот пример демонстрирует возможности использования ленивых вычислений и бесконечных списков в Scala. Бесконечный список чисел Фибоначчи fibs определяется при помощи фунций .zip и .tail по аналогии с примером на Haskell. Пример предназначен для интерактивной интерпретации.

lazy val fib: Stream[Int] = Stream.cons(1, Stream.cons(1, fib.zip(fib.tail).map(p => p._1 + p._2)))
fib.take(16).print

Квадратное уравнение:

Пример для версий Scala 2.8.0-final

Из этого примера видно, что многие вещи — математика, обработка ввода, работа со строками — в Scala заимствована из Java.

import java.io.{BufferedReader, InputStreamReader}
 
object Main {
    def main(args: Array[String]) {
        var stdin = new BufferedReader(new InputStreamReader(System.in));
        var A = augmentString(stdin.readLine()).toInt;
        var B = augmentString(stdin.readLine()).toInt;
        var C = augmentString(stdin.readLine()).toInt;
        solve(A,B,C);
    }
    def output(real: Double, imag: Double): String = 
        if (imag == 0) ""+real
                  else "("+real+","+imag+")"
 
    def solve(A: Int, B: Int, C: Int)
    {   if (A == 0) print("Not a quadratic equation.")
        else
        {   def D = B*B - 4*A*C;
            if (D == 0) print("x = "+output(-B/2.0/A, 0));
            else if (D > 0) 
                      print("x1 = "+output((-B+Math.sqrt(D))/2.0/A, 0)+"\nx2 = "+output((-B-Math.sqrt(D))/2.0/A, 0));
                 else print("x1 = "+output(-B/2/A, Math.sqrt(-D)/2.0/A)+"\nx2 = "+output(-B/2/A, -Math.sqrt(-D)/2.0/A));
        }
    }
}

CamelCase:

Пример для версий Scala 2.8.0-final

Этот пример использует два разных регулярных выражения. Первое, words, описывает слова текста; все подстроки, подходящие под это выражение, переводятся в нижний регистр с первой буквой верхнего регистра. Второе, separators, описывает промежутки между словами, которые просто удаляются из строки.

import java.io.{BufferedReader, InputStreamReader}
import scala.util.matching.Regex
 
object Main {
    def main(args: Array[String]) {
        var stdin = new BufferedReader(new InputStreamReader(System.in));
        var text = stdin.readLine();
        val words = """([a-zA-Z]+)""".r
        text = words.replaceAllIn(text, m => m.matched.toLowerCase.capitalize)
        val separators = """([^a-zA-Z]+)""".r
        text = separators.replaceAllIn(text, "");
        println(text);
    }
}

Комментарии

]]>

blog comments powered by Disqus

]]>

Работа программистам