Scala для всех (РИФ 2015)Арсений ЖижелевКраткое введение в Scala для разработчиков на других языках. Рассмотрены несколько простых программ, написанных с использованием красивых возможностей Scala.
Андрей Карпов, Приватные байки от разработчиков анализатора кодаSergey PlatonovДоклад о редких нестандартных расширениях языка С++, про которые никто не знает, но которые надо поддерживать в анализаторе кода.
О магии Visual C++ с файлом stdafx.h, когда проект компилируется, хотя не должен. О том как зародился viva64 (предшественник PVS-Studio) для поиска 64-битных проблем. Как и почему исчез анализ кода, который одно время существовал в компиляторе Intel C++.
HaskellDevDayФункциональное программирование в примерах.
Язык Haskell: характеристики, история, сильные и слабые стороны, истории успеха и неудач.
Спецификация Haskell’98: синтаксис, компиляторы, интепретаторы, документация, IDE.
Особенности языка: тип Maybe, списки, классы типов, основы монад.
Библиотеки и фреймворки: Parsec, GenXml, HaXml
DSL
На десерт что-то из Existential Types, State Monad, ST Monad, Monad Transformers.
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...corehard_byДоклад посвящён вопросам реализации пропозала Герба Саттера PR0707 (метаклассы в С++) за пределами компилятор - в виде отдельной утилиты. Будет продемонстрированы варианты использования метаклассов в реальной жизни, затронуты вопросы их реализации на базе Clang Frontend, а также возможные перспективы развития технологии и методики.
Back to the future: Функциональное программирование вчера и сегодняAlexander GraninЛекция в рамках TechTalks @NSU о наиболее значимых идеях и принципах, которые пришли в enterprise из мира функционального программирования.
C++ idiomsCOMAQA.BY Не всегда задачи решаются в терминах языка программирования. И когда дело доходит до реализации, иногда "волосы становятся дыбом" от мысли, как это придется делать на конкретном языке. В данном докладе автор "изольет душу" на тему идиом в языках программирования, чем они отличаются от паттернов проектирования, рассмотрит преимущества и недостатки их использования, а также подробно рассмотрит несколько наиболее популярных идиом для C++.
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4 Dima DzubaОписываются возможности C++ по работе с наследованием (virtual, override, final). Описываются механизмы работы с константными переменными и методами (const, mutable, constexpr). Описываются возможности по перегрузке операторов (operator).
хитрости выведения типовcorehard_byВ докладе будут сделаны попытки ответить на вопросы, какой тип скрывается под маской auto, почему T&& не всегда rvalue, и почему move ничего не двигает.
Legacy: как победить в гонке (Joker)Victor_Cr
У вас древний проект? Все зовут его «Legacy», а вас «неудачник»? Возможно они даже смеются над вами.
Давайте взглянем на ситуацию с другого ракурса. Все (все, Карл!) успешные проекты рано или поздно превращаются в Legacy-проекты.
Я затрону тему Legacy не просто как явление, а как возможность быть постоянно в тренде, прослыть супер-спецом (даже если ты знаешь всего два фреймворка), сделать карьеру, как делать, то что ты хочешь, а не то что тебя просят. Ладно, ладно, я наврал про два фреймворка, но все остальное чистая правда. Я покажу, что вы можете творить, имея правильный подход к Legacy коду.
Суть в том, что Legacy — это не грустно/уныло/немодно, это просто/клево/весело, если с умом подойти к задаче!
Переход на Scala: босиком по граблямSveta BozhkoThis document discusses transitioning a team from Java to Scala. It covers reasons for choosing Scala like its syntax and libraries. It also discusses challenges like testing and shared state in Scala. It provides recommendations to incrementally introduce Scala to avoid issues and constantly learn the new language through projects.
Play Template Engine Based On ScalaKnoldus Inc.A type-safe templating system based on scala, wich provides powerful way to create all such external representations of server-
side data.
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...corehard_byДоклад посвящён вопросам реализации пропозала Герба Саттера PR0707 (метаклассы в С++) за пределами компилятор - в виде отдельной утилиты. Будет продемонстрированы варианты использования метаклассов в реальной жизни, затронуты вопросы их реализации на базе Clang Frontend, а также возможные перспективы развития технологии и методики.
Back to the future: Функциональное программирование вчера и сегодняAlexander GraninЛекция в рамках TechTalks @NSU о наиболее значимых идеях и принципах, которые пришли в enterprise из мира функционального программирования.
C++ idiomsCOMAQA.BY Не всегда задачи решаются в терминах языка программирования. И когда дело доходит до реализации, иногда "волосы становятся дыбом" от мысли, как это придется делать на конкретном языке. В данном докладе автор "изольет душу" на тему идиом в языках программирования, чем они отличаются от паттернов проектирования, рассмотрит преимущества и недостатки их использования, а также подробно рассмотрит несколько наиболее популярных идиом для C++.
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4 Dima DzubaОписываются возможности C++ по работе с наследованием (virtual, override, final). Описываются механизмы работы с константными переменными и методами (const, mutable, constexpr). Описываются возможности по перегрузке операторов (operator).
хитрости выведения типовcorehard_byВ докладе будут сделаны попытки ответить на вопросы, какой тип скрывается под маской auto, почему T&& не всегда rvalue, и почему move ничего не двигает.
Legacy: как победить в гонке (Joker)Victor_Cr
У вас древний проект? Все зовут его «Legacy», а вас «неудачник»? Возможно они даже смеются над вами.
Давайте взглянем на ситуацию с другого ракурса. Все (все, Карл!) успешные проекты рано или поздно превращаются в Legacy-проекты.
Я затрону тему Legacy не просто как явление, а как возможность быть постоянно в тренде, прослыть супер-спецом (даже если ты знаешь всего два фреймворка), сделать карьеру, как делать, то что ты хочешь, а не то что тебя просят. Ладно, ладно, я наврал про два фреймворка, но все остальное чистая правда. Я покажу, что вы можете творить, имея правильный подход к Legacy коду.
Суть в том, что Legacy — это не грустно/уныло/немодно, это просто/клево/весело, если с умом подойти к задаче!
Переход на Scala: босиком по граблямSveta BozhkoThis document discusses transitioning a team from Java to Scala. It covers reasons for choosing Scala like its syntax and libraries. It also discusses challenges like testing and shared state in Scala. It provides recommendations to incrementally introduce Scala to avoid issues and constantly learn the new language through projects.
Play Template Engine Based On ScalaKnoldus Inc.A type-safe templating system based on scala, wich provides powerful way to create all such external representations of server-
side data.
Scala.jsVitaly TsaplinScala.js is a compiler that compiles Scala source code to equivalent Javascript code.
Just like regular Scala, Scala.js offers all those fantastic language features that we know and love: generic classes, type inference, traits and objects, case classes and pattern matching, etc. Scala.js is fully interoperable with JavaScript and allows seamless integration with existing JavaScript libraries.
Intro scala for rubyists (ironhack)Ignasi Marimon-Clos i SunyolIronhack Barcelona is a bootcamp teaching non programmers Ruby and javascript. In their meetup they invited me to introduce scala. Several non-ironhackers (senior and java background) signed up so this is a talk that's partly intro to scala for a junior from Ruby and some more generic advanced concepts.
Introducing Scalate, the Scala Template EngineJames StrachanThe document introduces Scalate, a Scala-based template engine. It discusses Scalate's design goals of making an extensible template engine that leverages Scala's power and type safety. Key features include compiled and cached templates, static typing, and support for layouts. The document outlines Scalate's usage of a TemplateEngine to load templates and RenderContext to render them. It also describes several template languages supported by Scalate, including SSP, Scaml, Jade, Mustache and Scalate.
Scala in practice - 3 years laterpatfornaThis document discusses Patric Fornasier's experience over 3 years using Scala at Springer, an academic publisher. While Scala increased productivity initially and attracted engineers, complexity issues emerged over time like slow compilation, poor tooling, and entanglements from traits. To address these, the team reduced code size, traits usage, and complexity. In the future, the team may use Java 8 for new projects and embrace polyglotism for smaller teams due to Scala's challenges with complexity and tooling.
Golang from Scala developer’s perspectiveSveta BozhkoMy talk from Functional Vilnius MeetUp #6.
http://www.functionalvilnius.lt/posts/2015-10-03-6th-meetup-announcement.html
Golang is becoming more and more popular. Most likely many of you have heard of its upgraded garbage collector and possibilities to work with lightweight threads – goroutines. Obviously, Golang is quite a good choice for server-side software oriented on a huge load. As Scala backend developer, I am a big fan of functional programming and actor model. Golang seems very promising, but from the first glance, its a totally imperative language. In my speech I’m going to tell about my experiments with Golang and attempt to use it as a functional language.
Reactive Access to MongoDB from ScalaHermann HueckThis talk describes how to access MongoDB reactively from Scala using different drivers and different access strategies/technologies.
Scala Past, Present & FuturemircodottaCan you believe that the Scala programming language is already 13 years old? Scala was an experiment back in 2003, but there are no questions today about its success and its great influence on other languages, especially on Java. In this session we will travel time, going back to the age when Java was the hacker’s drink, while Pizza was the hacker’s food. We will glance through some of the memorable moments, and land in the present days to introduce all the goodnesses available in the upcoming Scala 2.12 release. Finally, we will take a brief but intense look at what we can expect from the future. Prepare your time traveling equipment, and be ready to rewind the clock to more than 20 years ago!
The Evolution of ScalaMartin Oderskyݺߣs of the keynote given at the Programming Language Evolution Workshop and the Scala Symposium, July 28th, Uppsala, Sweden.
Joy of scalaMaxim Novak"The joy of Scala" - Maxim Novak / Wix
Around eight years ago I started my journey as a developer. Since then, I've played around with many languages and thought that C# offers the best developer productivity. After joining Wix two years ago, I was exposed to the amazing world of Scala and Functional Programming and never looked back.
In Scala the code is much more concise, less ceremonious, immutable by default, combines functional with object oriented, seamlessly interoperates with Java, and many software engineering patterns are already baked into the language. Most importantly - Scala is FUN! By the end of the session you too will, hopefully, convert to Scala and never look back.
Recording of the lecture (Hebrew) - https://youtu.be/TcnYTwff2xU
Six years of Scala and countingManuel BernhardtThis is an attempt at distilling six years of experience with the Scala programming language into one talk
Scala - A Scalable LanguageMario GleichmannThis document provides an introduction and overview of the Scala programming language. It discusses how Scala is a scalable language that is pure object-oriented, statically typed, functional, and runs on the JVM. It highlights some of Scala's key features like everything being an object, no primitive types, and operations being method calls. Motivations for using Scala over Java are presented, including support for functions and closures, an extended type system, and properties of essence over ceremony and extended control structures.
Macro in ScalatakezoeThis document discusses macros in Scala. Macros allow code to be generated at compile time by expanding directives or generating abstract syntax trees (ASTs). Examples show how macros can be used for validation, type generation, domain-specific languages (DSLs), and optimization without runtime overhead. The document explains macro types in Scala, how to construct ASTs using AST models, reify, and quasiquotes, and future plans to replace scala.reflect with the safer scala.meta metaprogramming toolkit.
Scala Frameworks for Web Application 2016takezoeThis document compares various Scala frameworks for building web applications and interacting with databases. It discusses alternatives to the standard Play and Slick frameworks, including Finagle, Akka HTTP, Skinny Micro, Quill, doobie, and ScalikeJDBC. For web frameworks, all the alternatives look promising but Play is also still viable. For databases, there is no clear standard yet, but ScalikeJDBC appears suitable for most users.
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Yandex2 июля 2011, Я.Субботник в Екатеринбурге
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
О докладе:
Про Python и Django: зачем нужна красота и простота перфекционистам с дедлайнами, на примере Яндекс.Погоды.
Когда число сервисов, которые делаются в Яндексе, стало возрастать, дедлайны — поджимать, а от процесса разработки требовалось стать более гибким, возникла потребность в свежих решениях. В докладе на примере Яндекс.Погоды рассказывается, как в Яндексе делают сервисы с помощью языка Python и веб-фреймворка Django.
Урок 7. Интерпретация и компиляция функциональных программ.Система дистанционного обучения MyDLSУрок 7. Интерпретация и компиляция функциональных программ. Больше интересных публикаций смотри на сайте mydls.ru
Haskell Lite - presentation for DevDay about Haskell languageAlexander GraninPresentation about Haskell programming language.
DevDay, 31.05.2013, Novosibirsk
Video: http://www.youtube.com/watch?v=ieOhEX1RCB8
QA Fest 2015. Иван Пашко. XPath yourself. Tips & TricksQAFestВсе мы знаем, что такое XPath и широко используем его в автоматизации. Но неправильное построение XPath выражений приводит тестровщиков в ужас, делает наши тесты хрупкими, и как результат - получаем долгие вечера отладки кода. В докладе я расскажу о том, что такое XPath, о распространенных ошибках при работе с ним, и как их избегать. Будет интересно и начинающим тестировщикам, и экспертам в области автоматизации.
2. О себе
Занимаюсь системным программированием
● компиляторы, среды исполнения
● Excelsior JET - JVM with AOT compiler
● код на орбите (ГЛОНАСС)
Преподаю
● научное руководство студентами (НГУ)
● подготовка юниоров в компании
Участник Scala community
● Scala core committer (stdlib, compiler)
● Организовал ScalaNsk
5. Excelsior JET
● Полная реализация Java SE
○ первый релиз - 2000 год
○ с 2005 сертифицирована как Java Compatible
● AOT Compiler + Java Runtime
○ смешанная компиляция: AOT + JIT
○ поддержка нестандартных загрузчиков классов в
AOT режиме (для Eclipse RCP, Tomcat)
● Toolkit
○ Deployment
○ Startup Optimizer
6. Excelsior JET
● Одна из 4х Java SE VM, сделанных с нуля
○
○
○
○
Sun/Oracle HotSpot
JRockit
IBM J9
Excelsior JET
● Было: очень древний codebase
○ заложен в конце 80х/начале 90х
○ код морально устарел
○ изменилось всё: требования, технологии,
инструменты, процессы
○ куда податься?
7. Требования к языку
● Возможность создавать большие системы
○ и долгоживущие
○ и сложные
● Производительность
● статическая типизация
● развитые инструменты разработки
● промышленное качество
8. Требования к языку
● Возможность создавать большие системы
○ и долгоживущие
○ и сложные
● Производительность
● Java и/или C++
9. Требования к языку
● Возможность создавать большие системы
○ и долгоживущие
○ и сложные
● Производительность
● Самоприменимость
● Java
10. Требования к языку
● Возможность создавать большие системы
○ и долгоживущие
○ и сложные
● Производительность
● Самоприменимость
● Java? А как насчёт:
○
○
○
○
скорости разработки?
объёма кода?
гибкости, мощи средств языка?
в конце концов, количества fun’а?
12. JET на Scala: наш опыт
●
●
●
●
Оптимизирующий компилятор
Новое ядро, implemented from scratch
R&D "по-взрослому"
Команда: ≤5 человек
○ 4 из них не знали Скалу
● Время: 1.5 года * 4 человек
○ всё работает, релиз был в апреле 2013
○ ~40kloc
14. Язык Scala: характеристика
● компилируемый
● строго статически типизированный
● автоматический вывод типов (type
inference)
● OOP + FP
● "лёгкий" синтаксис
● работает на платформе JVM
● бесшовная интеграция с Java
15. Язык Scala: цели
● Язык общего назначения
● Альтернатива/замена Java
● Внедрение FP в mainstream
● Преодоление "застоя" в OOP
Целевая аудитория:
1. Java-программисты (народные массы)
Лучший язык, FP
2. Ruby/Python(/JS)-программисты
Статическая типизация, производительность
3. Функциональщики
Использование FP в mainstream
35. Hello, REPL!
scala> val repl = Map('R' -> "Read", 'E' -> "Eval",
|
'P' -> "Print", 'L' -> "Loop")
repl: immutable.Map[Char,String] = Map(...)
scala> for ((k, v) <- repl) println(s"$k is for $v")
R is for Read
E is for Eval
P is for Print
L is for Loop
36. Синтаксис: values & variables
val x: Int = 42
val ys = List(1, 2, 3)
// y: List[Int]
var z = "hello"
// z: String
37. Синтаксис: values & variables
val x: Int = 42
val ys = List(1, 2, 3)
// y: List[Int]
var z = "hello"
// z: String
make val not var
38. Синтаксис: functions
val x: Int = 42
val ys = List(1, 2, 3)
// y: List[Int]
var z = "hello"
// z: String
def max(a: Int, b: Int): Int = if (a > b) a else b
def inc(x: Int) = x + 1
val inc = { x: Int => x + 1 }
// inc: Int => Int
39. Синтаксис: основы
val x: Int = 42
val ys = List(1, 2, 3)
// y: List[Int]
var z = "hello"
// z: String
def max(a: Int, b: Int): Int = if (a > b) a else b
def inc(x: Int) = x + 1
val inc = { x: Int => x + 1 }
// inc: Int => Int
ys map inc
// List(2, 3, 4)
ys map { x => x + 1 }
ys map { _ + 1 }
ys filter { _ % 2 != 0 }
// List(1, 3)
ys reduce max
// max(1, max(2, 3))
ys reduce { (x, y) => x + y }
// 1 + 2 + 3
40. Классы и объекты
abstract class Animal {
def name: String
}
class Person(firstName: String, lastName: String)
extends Animal {
val name = firstName + " " + lastName
}
class Employee(firstName: String, lastName: String,
val age: Int, var salary: Double)
extends Person(firstName, lastName)
object Main extends App {
val p = new Employee("John", "Doe", 20, 300.0)
println(p.name + " is + p.age + " years old")
}
43. Operators are methods
List(1, 2, 3).map(inc)
// List(2, 3, 4)
List(1, 2, 3) map inc
// <- операторный синтаксис
abstract class Set[T] {
def contains(x: T): Boolean
def - (x: T): Set[T]
def !@#%^&*-+ : Int
// <- пожалуй, так делать не стоит
}
def foo(s: Set[Int]) {
if (s contains 42) println(s - 42)
}
1 + 3*5
=>
1.+(3.*(5))
44. Functions are objects
Функциональные типы: (A => B)
trait Function1[A, B] {
def apply(x: A): B
}
val inc = { x: Int => x + 1 }
val inc = new Function1[Int, Int] {
def apply(x: Int): Int = { x + 1 }
}
inc(4)
// inc.apply(4)
// Function1[A, B]
45. Вызов и индексация
val inverse = { x: Int => 1.0 / x }
inverse(1)
// =>
inverse.apply(1)
val a = Array(0.33, 0.5) // =>
Array.apply(0.33, 0.5)
a(1) /*0.5*/
// =>
a.apply(1)
a(0) = 1.0
// =>
a.update(0, 1.0)
def foo(f: Int => Double) {
println(f(1))
// =>
println(f.apply(1))
}
foo(inverse)
// 1.0
foo(a)
// 0.5
Array[T] is a function (Int => T)!
46. Pattern matching
val anything: Any = ...
val str = anything match {
case 1
=> "one"
case x: Int if x > 0
=>
"positive integer"
case x: Float if x > 0
=>
"positive float"
case _: String
=>
"string"
case _
=>
"unknown"
}
“switch/case на стероидах”
47. Алгебраические типы
type List[T] = Nil
| Cons(head: T, tail: List[T])
type Option[T] = None
| Some(value: T)
type Tree[T] = Leaf
| Branch(l, r: Tree[T], value: T)
48. ADT in action
sealed class Expr
case class Var(name: String) extends Expr
case class Num(value: Int) extends Expr
case class Neg(arg: Expr) extends Expr
case class Add(arg1: Expr, arg2: Expr) extends Expr
def optimize(expr: Expr): Expr = expr match {
case Neg(Neg(x))
=> optimize(x)
case Add(x, Num(0))
=> optimize(x)
case Neg(Num(x))
=> Num(-x)
case Add(x, Neg(y)) if x == y => Num(0)
case Add(Num(x), Num(y))
case Neg(x)
=> Neg(optimize(x))
case Add(x, y)
=> Add(optimize(x), optimize(y))
case _
}
=> Num(x + y)
=> expr
49. Pattern matching: extractors
object PowerOfTwo {
import java.lang.Long.{numberOfLeadingZeros => nlz}
def apply(i: Int): Long = 1L << i
def unapply(x: Long): Option[Int] =
if (((x & (x-1)) == 0) && (x > 0))
Some(63 - nlz(x)) else None
}
def optimize(e: Expr) = e match {
case Mul(x, PowerOfTwo(n)) => Shl(x, n)
case Div(x, PowerOfTwo(n)) => Shr(x, n)
case Rem(x, PowerOfTwo(n)) => And(x, PowerOfTwo(n) - 1)
}
50. Коллекции & итерация
Коллекции - первая по важности вещь после
собственно языковых фич
● Они вездесущи
● Дизайн стандартной библиотеки коллекций
влияет на каждую программу, причём в
значительной степени
● Они формируют словарь, с помощью
которого программист выражает свои
мысли
52. Scala Collections: API
● functional-style
● collect, count, exists, filter, find, flatMap, fold, forall,
●
foreach, groupBy, map, max/min, partition, reduce,
splitAt, take, to, ...
примеры:
val people: Seq[Person] = ...
val (minors, adults) = people partition (_.age < 18)
● параллельные коллекции: .par, tuning (thread pools
etc.)
53. for comprehension
● обобщённый цикл for
○ с поддержкой фильтров и pattern matching
●
●
●
●
преобразователь потоков данных
язык запросов
монадический комбинатор
всего лишь синтаксический сахар
54. for loop: basic form
val files: Seq[File] = ...
for (file <- files) {
println(file.getName)
}
files foreach { file =>
println(file.getName)
}
val names = for (file <- files) yield file.getName
val names = files map { _.getName }
55. for loop: filters & nested loops
def content(f: File): Seq[String] = ???
for {
file <- files
if !file.getName.startsWith(".")
line <- content(file)
if line.nonEmpty
} println(file + ": " + line)
files withFilter (!_.getName.startsWith(".")) foreach { file =>
content(file) withFilter (_.nonEmpty) foreach { line =>
println(file + ": " + line)
}
}
56. for loop: filters & nested loops
def content(f: File): Seq[String] = ???
val lines = for {
file <- files
if !file.getName.startsWith(".")
line <- content(file)
if line.nonEmpty
} yield file + ": " + line
files withFilter (!_.getName.startsWith(".")) flatMap { file =>
content(file) withFilter (_.nonEmpty) map { line =>
file + ": " + line
}
}
60. Строковые интерполяторы
val name = "John"
s"Hello, $name" // то же, что "Hello, " + name
println(f"$companyName%15s")
val a: Int = b"100011"
sql"select * from user where id = $id"
61. Строковые интерполяторы
Простейший html-интерполятор для Play:
val link = "http://example.com"
val userName = "Joe"
val content = html"""
<img src=/slideshow/scala-java-javaday-nsk-28112013/28932173/"user.png"/> $userName"""
val result = html"""
<a href="$link">$content</a>"""
62. Строковые интерполяторы
Простейший html-интерполятор для Play:
implicit class HtmlInterpolatorHelper(val sc: StringContext) extends AnyVal {
def html(args: Any*): Html = {
val strings = sc.parts.iterator
val expressions = args.iterator
val buffer = new StringBuilder(strings.next())
while(strings.hasNext) {
val nextExpr = expressions.next()
nextExpr match {
case html: Html => buffer.append(html.toString)
case other => buffer.append(HtmlFormat.escape(other.toString))
}
buffer.append(strings.next())
}
new Html(buffer)
}
}
65. Parallelism & concurrency
val people: Seq[Person] = ...
val (minors, adults) = people.par partition (_.age < 18)
actor {
receive {
case people: Seq[Person] =>
val (minors, adults) = people partition (_.age < 18)
School ! minors
Work ! adults
}
}
66. Асинхронность: Futures
val f: Future[List[String]] = future {
session.getRecentPosts
}
f onSuccess {
case posts =>
for (p <- posts) println(p)
}
f onFailure {
case t =>
println("An error has occurred: " + t.getMessage)
}
67. Combining futures with ‘for’
val usdQuote = future { connection.getCurrentValue(USD) }
val chfQuote = future { connection.getCurrentValue(CHF) }
val purchase = for {
usd <- usdQuote
chf <- chfQuote
if isProfitable(usd, chf)
} yield connection.buy(amount, chf)
purchase onSuccess {
case _ => println(s"Purchased $amount CHF")
}
69. Tools
IDEs: IDEA, Eclipse, NetBeans
+ Emacs, vim, Sublime, TextMate
Building: SBT
but also ant, Maven, etc...
Testing: ScalaTest, Specs, ScalaCheck
but also JUnit, EasyMock, Mockito, etc...
Web frameworks: Lift, Play!
but also Struts, Spring MVC, etc...
+ all that Java stuff
70. Libraries & frameworks
DB query & access: Slick (LINQ-like)
UI: ScalaFX
Text processing: parser combinators (stdlib)
GPGPU: ScalaCL
...and many others
71. Как правильно начать?
●
●
●
●
●
Хотя бы один эксперт - большой плюс
Не увлекайтесь фичами
Периодический рефакторинг
Используйте в юнит-тестах
Изучив Scala Вы станете лучше писать на
Java
74. Case classes and pattern matching
● Pattern matching - обобщённый switch/case
● Case classes - реализация ADT
Преимущества Scala:
● Case class - больше чем ADT:
интерфейсы, методы, данные
● Pattern matching customizable by user:
абстракция логики от структуры данных,
DSLs
75. Case classes
case class Person(name: String, age: Int)
class Person(val name: String, val age: Int)
extends Serializable {
override def equals(other: AnyRef) = ...
override def hashCode = ...
override def toString = ...
def copy(name: String = this.name, age: Int = this.age) = ...
}
object Person extends (String, Int) => Person {
def apply(name: String, age: Int) = new Person
def unapply(p: Person): Option((String, Int)) =
Some((p.name, p.age))
76. Partial functions
trait Function1[T, R] {
def apply(x: T): R
}
trait PartialFunction[T, R] extends Function1[T, R] {
def isDefinedAt(x: T): Boolean
}
List(1,3,5,7) collect { case n if n < 5 => n + 1 }
val pf = new PartialFunction[Int, Int] {
def apply(x: Int): Int = x match
{ case n if n < 5 => n + 1 }
def isDefinedAt(x: Int): Boolean = x match
{ case n if n < 5 => true; case _ => false }
}
77. Promises
val p = promise[T}
val f = p.future
val producer = future {
val r = produceSomething()
p success r
continueDoingSomethingUnrelated()
}
val consumer = future {
startDoingSomething()
f onSuccess {
case r => doSomethingWithResult(r)
}
78. Promises
def first[T}(f: Future[T], g: Future[T]): Future[T] = {
val p = promise[T]
f onSuccess { case x => p.tryComplete(x) }
g onSuccess { case x => p.tryComplete(x) }
p.future
}