Download - Модерни езици за програмиране за JVM (2011)
![Page 1: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/1.jpg)
Модерни езици за програмира за JVM
JRuby, Groovy, Scala и Clojure.
![Page 2: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/2.jpg)
Що е Java?
Програмен език
Виртуална машина
Стандартна библиотека
![Page 3: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/3.jpg)
The beating heart of Java is not the Java programming language - it is the JVM and the
entire infrastructure built around it...
Maximus Decimus Meridius, Roman General & Java Programmer
![Page 4: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/4.jpg)
Езикът Java
Създаден да замени С++
Интегрира някои добри идеи от Lisp
Характеризира се с консервативен, но практичен дизайн
![Page 5: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/5.jpg)
Проблемите на езикът Java
Не е чист обектно-ориентиран език
Няма никаква поддръжка за функционален стил на програмиране
Не е особено експресивен
Развитието му е ограничено от изискванията за обратна съвместимост
![Page 6: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/6.jpg)
Че то алтернативи има ли?
1996 - Java 1.0
1997 - 40 езика вече имат версия за JVM
2004 - 169 са JVM compatible
2011 - приблизително 300 езика се целят в JVM
![Page 7: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/7.jpg)
Причината?
The JVM is rock solid and heart touching at the same time.
Отлична производителност и прекрасен optimizer
Огромна база съществуващ Java код
Купища страхотни иструменти
![Page 8: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/8.jpg)
Не всичко е ток и жица
Java (< 7) нямаше поддръжка за динамичен метод dispatching
JVM не е оптимизиран за функционален стил на програмиране
JVM пали относително бавно
JVM имплементациите на някои езици (като Python) не са съвсем съвместими с native (C) имплементациите им
![Page 9: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/9.jpg)
Двете страни на Силата
Езици портнати към JVM
Езици създадени специално за JVM
![Page 10: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/10.jpg)
Претендентите
JRuby
Jython
Fantom
Groovy
Scala
Clojure
![Page 11: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/11.jpg)
Ruby
динамичен език за програмиране
компактен и елегантен синтаксис
създаден да направи програмистите щастливи
made in Japan
![Page 12: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/12.jpg)
Преди Ruby
![Page 13: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/13.jpg)
Сега (като Ruby програмист)
![Page 14: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/14.jpg)
Hello, Ruby# Output "I love Ruby"say = "I love Ruby"puts say # Output "I *LOVE* RUBY"say['love'] = "*love*"puts say.upcase # Output "I *love* Ruby"# five times5.times { puts say }
![Page 15: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/15.jpg)
JRuby - Java & Ruby sitting in a tree
Ruby е елегантен език с бавен runtime
JVM е много бърз runtime
JRuby дава възможност на Java програмистите да използват технологии като Rails
JRuby дава възможност на Ruby програмистите да ползват Java библиотеки
![Page 16: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/16.jpg)
jruby-1.6.1 :001 > puts "Hello, JRuby"Hello, JRuby => niljruby-1.6.1 :002 > arr = ["Chuck", "Sarah", "Morgan", "Casey"] => ["Chuck", "Sarah", "Morgan", "Casey"]jruby-1.6.1 :003 > arr.length => 4jruby-1.6.1 :004 > arr.size => 4jruby-1.6.1 :005 > arr.size() => 4jruby-1.6.1 :006 > arr.each { |name| puts name }ChuckSarahMorganCasey => ["Chuck", "Sarah", "Morgan", "Casey"]jruby-1.6.1 :007 > arr.each_with_index { |name, index| puts "##{index}: #{name}"}0: Chuck1: Sarah2: Morgan3: Casey => ["Chuck", "Sarah", "Morgan", "Casey"]
Загрявка в jirb
![Page 17: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/17.jpg)
Ако прилича на патица...class Duck def walk puts "The duck walks" end
def quack puts "The duck quacks" endend
class Dog def walk puts "The dog walks" end
def quack puts "The dog quacks" endend
def test_animal(animal) animal.walk animal.quackend
test_animal(Duck.new)test_animal(Dog.new)
![Page 18: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/18.jpg)
Java от Rubyrequire 'java'java_import 'java.lang.System'java_import 'java.util.ArrayList'java_import 'javax.swing.JOptionPane'
System.out.println("Feel the power of JRuby")
## using snake_names for Java method namesputs System.current_time_millis## regular names work as wellputs System.currentTimeMillis
array_list = ArrayList.new
## the array list supports some common Ruby idiomsarray_list << 1array_list.add 2array_list << 3
puts "List length is ##{array_list.length}"
array_list.each { |elem| puts elem }
## a glimpse of SwingJOptionPane.show_message_dialog(nil, "This is a message from the future of Ruby!")
![Page 19: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/19.jpg)
Ruby от Java
import org.jruby.embed.InvokeFailedException;import org.jruby.embed.ScriptingContainer;
public class RubyFromJava { public static void main(String[] args) { ScriptingContainer container = new ScriptingContainer(); container.runScriptlet("puts 'Ruby bridge established successfully'" ); }}
![Page 20: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/20.jpg)
Стана ми интересно, къде да науча повече?
http://batsov.com/articles/2011/05/18/jvm-langs-jruby/
![Page 21: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/21.jpg)
It’s a Groovy kind of love...
![Page 22: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/22.jpg)
Хвала на Groovy
Groovy is like a super version of Java. It can leverage Java's enterprise capabilities but also has
cool productivity features like closures, builders and dynamic typing. If you are a developer, tester
or script guru, you have to love Groovy.
![Page 23: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/23.jpg)
def name='World'; println "Hello $name!"
class Greet { def name Greet(who) { name = who[0].toUpperCase() + who[1..-1] } def salute() { println "Hello $name!" }}
g = new Greet('world') // create objectg.salute() // output "Hello World!"
import static org.apache.commons.lang.WordUtils.*
class Greeter extends Greet { Greeter(who) { name = capitalize(who) }}
new Greeter('world').salute()
groovy -e "println 'Hello ' + args[0]" World
![Page 24: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/24.jpg)
Groovy e...
динамичен
изцяло обектно-ориентиран
вдъхновен от Ruby, Python и Smalltalk
със синтаксис много близък до този на Java
създаден да улесни живота на Java програмистите
![Page 25: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/25.jpg)
Ключовите моменти
closures
attributes
duck typing
аритметика базирана на BigDecimal
улеснена работа с XML, SQL, Swing, etc
![Page 26: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/26.jpg)
Groovy & Java
Groovy програмите се компилират до Java bytecode
Същите низове, същите регулярни изрази и т.н.
Същите API
Същия модел за сигурност, същия нишков модел
Същите ОО концепции
![Page 27: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/27.jpg)
// old school Java code, but also valid Groovy codeSystem.out.println("Hello, world!");
// idiomatic Groovyprintln "Hello, world!"
// dynamic variable definitiondef name = "Bozhidar"
// GString featuring string interpolationprintln "Hello, $name" // => "Hello, Bozhidar"
// statically typed variableString songName = "Coding in the Name of"
println "Now playing - $songName"
String multiline = """this is a multilinestring. There is not need to embednewline characters in it"""
println multiline
// method definitiondef greet(name) { println "Hello, $name!"}
// method invocationgreet "Bozhidar"greet("Bozhidar")
![Page 28: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/28.jpg)
showSize([1, 2, 3])// this is the important partshowSize(null)
// a listdef beers = ["Zagorka", "Bolyarka", "Shumensko", "Ariana"]
// list accessprintln "My favourite beer is ${beers[1]}"
beers.each { beer -> println beer }
// imports can appear anywhere and support the creation of aliasesimport static java.util.Calendar.getInstance as nowimport java.sql.Date as SDate
println now()// java.util package is automatically imported in Groovy so this is java.util.Dateprintln new Date()println new SDate(2011, 5, 5)
![Page 29: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/29.jpg)
// language support for regular expressionsif ("Hello, Groovy" =~ /\w+,\s\w+/) { println "It matches"}
// range filtering with higher-order functions(1..10).findAll { n -> n % 2 == 0}.each { n -> println n }
// mapdef capitols = [Bulgaria: "Sofia", USA: "Washington", England:"London", France:"Paris"]
println capitols["Bulgaria"] // => Sofiaprintln capitols["France"] // => Paris
// class definitionclass Person { def name def age
Person(name, age) { this.name = name this.age = age }
@Override String toString() { return "Name {$name}, age {$age}" }}
def me = new Person("Bozhidar", 26)println me
![Page 30: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/30.jpg)
JDBC подобренияimport groovy.sql.Sqlsql = Sql.newInstance("jdbc:mysql://host/db", "username", "password", "com.mysql.jdbc.Driver")sql.eachRow("select * from tableName", { println it.id + " -- ${it.firstName} --"} )
1 -- Bozhidar --2 -- Jim --3 -- Jack --4 -- Valentine --
Изход от програмата
![Page 31: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/31.jpg)
XML<books> <book> <title>Dune</title> <author firstname="Frank" lastname="Herbert"/> </book> <book> <title>Dune Messiah</title> <author firstname="Frank" lastname="Herbert"/> </book> <book> <title>Children of Dune</title> <author firstname="Frank" lastname="Herbert"/> </book> <book> <title>A Game of Thrones</title> <author firstname="George" lastname="Martin"/> </book></books>
def books = new XmlSlurper().parse("books.xml")books.book.each { println "Title = ${it.title}, Author: ${it.author.@firstname} ${it.author.@lastname}"}
![Page 32: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/32.jpg)
Builders
import groovy.xml.*
def page = new MarkupBuilder()page.html { head { title 'Hello, Groovy!' } body { div { 3.times { p "Groovy power!" } } }}
<html> <head> <title>Hello, Groovy!</title> </head> <body> <div> <p>Groovy power!</p> <p>Groovy power!</p> <p>Groovy power!</p> </div> </body></html>
![Page 33: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/33.jpg)
Swingimport java.awt.FlowLayout
builder = new groovy.swing.SwingBuilder()langs = ["Groovy", "Scala", "Clojure"]gui = builder.frame(size: [290, 100], title: 'Groovy Swing') { panel(layout: new FlowLayout()) { panel(layout: new FlowLayout()) { for (lang in langs) { radioButton(text: lang) } } button(text: 'Perform Magic', actionPerformed: { builder.optionPane(message: "Feel the power of Groovy!"). createDialog(null, 'Message').show() }) button(text: 'Quit', actionPerformed: {System.exit(0)}) }}gui.show()
![Page 34: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/34.jpg)
Инструментите на занаята
groovy - интерпретатор
groovysh - конзола
groovyc - компилатор
groovyconsole - графична конзола
![Page 35: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/35.jpg)
Приложения убийци (killer apps)
Grails - модерна платформа за разработка на уеб приложения, вдъхновена от Ruby on Rails
Gradle - могъщ build tool, създаден да наследи Maven
Griffon - модерна платформа за разработка на Swing приложения
![Page 36: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/36.jpg)
IDE-та, нещо?
IntelliJ IDEA - Bozhidar’s Choice
Eclipse
NetBeans
![Page 37: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/37.jpg)
Where do we go now?
http://batsov.com/articles/2011/05/06/jvm-langs-groovy/
![Page 38: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/38.jpg)
Ride the eSCALAtor
If I were to pick a language to use today other than Java, it would be Scala...
James Gosling, father of Java
![Page 39: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/39.jpg)
Отмъщението на статично типизираните езици
Scala е статично типизиран език (като Java)
Scala използва type inference механизъм, който сериозно намалява типовите декларации
Кодът написан на Scala е толкова сигурен и бърз, колкото този написан на Java
![Page 40: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/40.jpg)
ООП и ФП могат да съжителстват в мир и любов
Scala е чисто обектно-ориентиран език
Scala включва в себе си много елементи от функционалното програмиране
higher order functions
function objects
pattern matching
tail recursion
![Page 41: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/41.jpg)
Expressive
scala> val romanToArabic = Map("I" -> 1, "II" -> 2, "III" -> 3, "IV" -> 4, "V" -> 5)romanToArabic: scala.collection.immutable.Map[java.lang.String,Int] = Map((II,2), (IV,4), (I,1), (V,5), (III,3))
scala> romanToArabic("I")res2: Int = 1
scala> romanToArabic("II")res3: Int = 2
![Page 42: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/42.jpg)
Компактен код, без излишна церемония
public boolean hasUpperCase(String word) { if (word == null) { return false; } int len = word.length(); for (int i = 0; i < len; i++) { if (Character.isUpperCase(word.charAt(i))) { return true; } } return false;}
def hasUppercase(word: String) = if (word != null) word.exists(_.isUpperCase) else false
Java
Scala
![Page 43: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/43.jpg)
Оптимизиран за мързели
class Person { private String name; private int age;
Person(String name, int age) { this.name = name; this.age = age; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }}
class Person(var name: String, var age: Int)
Scala
Java
![Page 44: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/44.jpg)
Актьорско майсторствоimport scala.actors.Actor._
case class Add(x: Int, y: Int)case class Sub(x: Int, y: Int)
val mathService = actor { loop { receive { case Add(x, y) => reply(x + y) case Sub(x, y) => reply(x - y) } }}
mathService !? Add(1, 3) // returns 4mathService !? Sub(5, 2) // returns 3
![Page 45: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/45.jpg)
Патоците на власт!class Duck { def quack = println("The duck quacks") def walk = println("The duck walks")}
class Dog { def quack = println("The dog quacks (barks)") def walk = println("The dog walks")}
def testDuckTyping(animal: { def quack; def walk }) = { animal.quack animal.walk}
scala> testDuckTyping(new Duck)The duck quacksThe duck walks
scala> testDuckTyping(new Dog)The dog quacks (barks)The dog walks
![Page 46: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/46.jpg)
Pimp my library
scala> implicit def intarray2sum(x: Array[Int]) = x.reduceLeft(_ + _)intarray2sum: (x: Array[Int])Int
scala> val x = Array(1, 2, 3)x: Array[Int] = Array(1, 2, 3)
scala> val y = Array(4, 5, 6)y: Array[Int] = Array(4, 5, 6)
scala> val z = x + yz: Int = 21
![Page 47: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/47.jpg)
Малко повече екшънscala> println("Hello, Scala")Hello, Scala
scala> val name = "Bozhidar"name: java.lang.String = Bozhidar
scala> Predef.println("My name is "+name)My name is Bozhidar
scala> var someNumber: Int = 5someNumber: Int = 5
scala> var names = Array("Superman", "Batman", "The Flash", "Bozhidar")names: Array[java.lang.String] = Array(Superman, Batman, The Flash, Bozhidar)
scala> names.filter(name => name.startsWith("B"))res6: Array[java.lang.String] = Array(Batman, Bozhidar)
scala> names.lengthres7: Int = 4
scala> name.length()res8: Int = 8
![Page 48: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/48.jpg)
...scala> import java.util.Dateimport java.util.Date
scala> var currentDate = new DatecurrentDate: java.util.Date = Wed May 11 15:03:20 EEST 2011
scala> println("Now is " + currentDate)Now is Wed May 11 15:03:20 EEST 2011
scala> currentDate.toStringres10: java.lang.String = Wed May 11 15:03:20 EEST 2011
scala> currentDate.toString()res11: java.lang.String = Wed May 11 15:03:20 EEST 2011
scala> currentDate toStringres12: java.lang.String = Wed May 11 15:03:20 EEST 2011
![Page 49: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/49.jpg)
Closures
scala> var x = 10x: Int = 10
scala> val addToX = (y: Int) => x + yaddToX: (Int) => Int = <function1>
scala> addToX(2)res0: Int = 12
scala> addToX(6)res1: Int = 16
scala> x = 5x: Int = 5
scala> addToX(10)res2: Int = 15
![Page 50: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/50.jpg)
Свързани списъциscala> 1 :: 2 :: 3 :: 4 :: 5 :: Nilres3: List[Int] = List(1, 2, 3, 4, 5)
scala> val names = List("Neo", "Trinity", "Morpheus", "Tank", "Dozer")names: List[java.lang.String] = List(Neo, Trinity, Morpheus, Tank, Dozer)
scala> names.lengthres4: Int = 5
scala> names.foreach(println)NeoTrinityMorpheusTankDozer
scala> names.map(_.toUpperCase)res6: List[java.lang.String] = List(NEO, TRINITY, MORPHEUS, TANK, DOZER)
scala> names.forall(_.length > 5)res7: Boolean = false
scala> names.forall(_.length > 2)res8: Boolean = true
![Page 51: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/51.jpg)
...scala> names.filter(_.startsWith("T"))res9: List[java.lang.String] = List(Trinity, Tank)
scala> names.exists(_.length == 3)res10: Boolean = true
scala> names.drop(2)res11: List[java.lang.String] = List(Morpheus, Tank, Dozer)
scala> names.reverseres12: List[java.lang.String] = List(Dozer, Tank, Morpheus, Trinity, Neo)
scala> names.sortBy(_.length)res13: List[java.lang.String] = List(Neo, Tank, Dozer, Trinity, Morpheus)
scala> names.sort(_ > _)res14: List[java.lang.String] = List(Trinity, Tank, Neo, Morpheus, Dozer)
scala> names.slice(2, 4)res16: List[java.lang.String] = List(Morpheus, Tank)
![Page 52: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/52.jpg)
scala> def testMatching(something: Any) = something match { | case 1 => "one" | case "two" => 2 | case x: Int => "an integer number" | case x: String => "some string" | case <xmltag>{content}</xmltag> => content | case head :: tail => head | case _ => "something else entirely" | }testMatching: (something: Any)Any
scala> testMatching(1)res18: Any = one
scala> testMatching("two")res19: Any = 2
scala> testMatching(2)res20: Any = an integer number
scala> testMatching("matrix")res21: Any = some string
scala> testMatching(<xmltag>this is in the tag</xmltag>)res22: Any = this is in the tag
scala> testMatching(List(1, 2, 3))res23: Any = 1
scala> testMatching(3.9)res24: Any = something else entirely
Pattern matching
![Page 53: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/53.jpg)
def length(list: List[Any]): Int = list match { case head :: tail => 1 + length(tail) case Nil => 0}
def length(list: List[Any]): Int = { def lengthrec(list: List[Any], result: Int): Int = list match { case head :: tail => lengthrec(tail, result + 1) case Nil => result }
lengthrec(list, 0)}
Tail recursion
Plain recursion
![Page 54: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/54.jpg)
Инвентара
scala - конзола/интерпретатор
scalac - компилатор
fsc - fast scala compiler
![Page 55: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/55.jpg)
IDE-тата
IntelliJ IDEA - Bozhidar’s Choice
Eclipse - Official Scala IDE
NetBeans - на тоя етап е бран бостан
![Page 56: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/56.jpg)
Убийците
Play! Framework
Lift
SBT (Simple Build Tool)
Akka
![Page 57: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/57.jpg)
The full disclosure on Clojure
![Page 58: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/58.jpg)
“Clojure feels like a general-purpose language beamed back from the near future. Its support for functional programming and software trans-actional memory is well beyond current practice and is well suited for multicore hardware. At the same time, Clojure is well grounded in the past and the present. It brings together Lisp and the Java Virtual Machine. Lisp brings wisdom spanning most of the history of programming, and Java brings the robustness, extensive libraries, and tooling of the dominant platform available today.”
![Page 59: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/59.jpg)
![Page 60: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/60.jpg)
What happens when an unstoppable force meets an
immutable object?
Clojure is dynamic
Clojure is functional
Clojure is a Lisp(1)
Clojure is designed for concurrency
Clojure is fighting accidental complexity
![Page 61: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/61.jpg)
Стилpublic boolean hasUpperCase(String word) { if (word == null) { return false; } int len = word.length(); for (int i = 0; i < len; i++) { if (Character.isUpperCase(word.charAt(i))) { return true; } } return false;}
(defn has-uppercase? [string] (some #(Character/isUpperCase %) string))
![Page 62: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/62.jpg)
Компактностclass Person { private String name; private int age;
Person(String name, int age) { this.name = name; this.age = age; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }}
(defrecord person [name age])
![Page 63: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/63.jpg)
Силата е на ваша страна
(defmacro and "Evaluates exprs one at a time, from left to right. If a form returns logical false (nil or false), and returns that value and doesn't evaluate any of the other expressions, otherwise it returns the value of the last expr. (and) returns true." {:added "1.0"} ([] true) ([x] x) ([x & next] `(let [and# ~x] (if and# (and ~@next) and#))))
![Page 64: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/64.jpg)
;;; Lists;; list creationuser> (list 1 2 3)(1 2 3);; quoted list creationuser> (def a-list '(1 2 3 4 5 6 7 8 9 10))#'user/a-list;; find the size of a listuser> (count a-list)10user> (first a-list)1user> (rest a-list)(2 3 4 5 6 7 8 9 10)user> (last a-list)10;; find the elements of the list matching a predicate(boolean function)user> (filter even? a-list)(2 4 6 8 10)user> (filter odd? a-list)(1 3 5 7 9);; map an anonymous(lambda) function to all elements of the listuser> (map #(* % 2) a-list)(2 4 6 8 10 12 14 16 18 20);; add an element to the beginning of the listuser> (cons 0 a-list)(0 1 2 3 4 5 6 7 8 9 10);; cons in a list specific function, conj is a general purpose one and;; works on all collection (but in a different manner)user> (conj a-list 0)(0 1 2 3 4 5 6 7 8 9 10)
Сърцето на Clojure
![Page 65: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/65.jpg)
;; retrieve the first five items in a listuser> (take 5 a-list)(1 2 3 4 5);; retrieve all but the first five items in a listuser> (drop 5 a-list)(6 7 8 9 10)user> (take-while #(< % 3) a-list)(1 2)user> (drop-while #(> % 3) a-list)(1 2 3 4 5 6 7 8 9 10)user> (drop-while #(< % 3) a-list)(3 4 5 6 7 8 9 10)
;;; Sets
user> (set '(1 2 3 4 5 1 2 3 4))#{1 2 3 4 5}user> (def a-set #{1 2 3 4 5})#'user/a-setuser> (contains? a-set 3)trueuser> (contains? a-set 7)falseuser> (conj a-set 5)#{1 2 3 4 5}user> (conj a-set 6)#{1 2 3 4 5 6}user> (disj a-set 1)#{2 3 4 5}user> (get a-set 1)1user> (get a-set 7)nil
...
![Page 66: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/66.jpg)
;;; Mapsuser> (hash-map :Bozhidar :Batsov :Bruce :Wayne :Selina :Kyle){:Selina :Kyle, :Bozhidar :Batsov, :Bruce :Wayne}user> (def a-map {:Bozhidar :Batsov, :Bruce :Wayne, :Selina :Kyle})#'user/a-mapuser> a-map{:Bozhidar :Batsov, :Bruce :Wayne, :Selina :Kyle}user> (get a-map :Bozhidar):Batsovuser> (contains? a-map :Bozhidar)trueuser> (contains? a-map :Clark)falseuser> (:Bozhidar a-map):Batsovuser> (assoc a-map :Lois :Lane){:Lois :Lane, :Bozhidar :Batsov, :Bruce :Wayne, :Selina :Kyle}user> (keys a-map)(:Bozhidar :Bruce :Selina)user> (vals a-map)(:Batsov :Wayne :Kyle)user> (dissoc a-map :Bruce){:Bozhidar :Batsov, :Selina :Kyle}user> (merge a-map {:Alia :Atreides, :Arya :Stark}){:Arya :Stark, :Alia :Atreides, :Bozhidar :Batsov, :Bruce :Wayne, :Selina :Kyle}
Хешове
![Page 67: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/67.jpg)
;;; Vectors
user> (vector 1 2 3 4)[1 2 3 4]user> [1 2 3 4][1 2 3 4]user> (def a-vector [1 2 3 4 5])#'user/a-vectoruser> (count a-vector)5user> (conj a-vector 13)[1 2 3 4 5 13];; random access is a constant time operation in vectorsuser> (nth a-vector 3)4user> (pop a-vector)[1 2 3 4]user> (peek a-vector)5
Вектори
![Page 68: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/68.jpg)
(def picked-numbers (ref #{})
(def secret-num (.nextInt (java.util.Random.) 10))
(defn guess-number [n] (print "Enter a guess between 1 and 10: ") (flush) (let [guess (java.lang.Integer/parseInt (read-line)) ] (cond (= guess n) (println "You guessed correctly") (contains? (deref picked-numbers) n) (println "Pick another number! You already tried that one.") :else (dosync (alter picked-numbers conj guess)))))
user=> (guess-number secret-num)Enter a guess between 1 and 10: 1#{1}user=> (guess-number secret-num)Enter a guess between 1 and 10: 3#{1 3}user=> (guess-number secret-num)Enter a guess between 1 and 10: 5#{1 3 5}
Програмиране с refs
![Page 69: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/69.jpg)
(def picked-numbers (atom #{})
(def secret-num (.nextInt (java.util.Random.) 10))
(defn guess-number [n] (print "Enter a guess between 1 and 10: ") (flush) (let [guess (java.lang.Integer/parseInt (read-line)) ] (cond (= guess n) (println "You guessed correctly") (contains? (deref picked-numbers) n) (println "Pick another number! You already tried that one.") :else (swap! picked-numbers conj guess))))
user=> (guess-number secret-num)Enter a guess between 1 and 10: 1#{1}user=> (guess-number secret-num)Enter a guess between 1 and 10: 3#{1 3}user=> (guess-number secret-num)Enter a guess between 1 and 10: 5#{1 3 5}
Атоми
![Page 70: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/70.jpg)
ООП по Лиспаджийски
(defmulti my-add (fn [x y] (and (string? x) (string? y))))
(defmethod my-add true [x y] (str x y))
(defmethod my-add false [x y] (+ x y))
user=> (my-add 3 4) ; => 7user=> (my-add "3" "4") ; => "34"
![Page 71: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/71.jpg)
Екстремист съм, какво ми трябва?
Обичайните заподозрени
Eclipse
IntelliJ
NetBeans
Emacs + SLIME = Bozhidar’s Choice
![Page 72: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/72.jpg)
Повече инфо, моля!
http://batsov.com/articles/2011/05/12/jvm-langs-clojure/
![Page 73: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/73.jpg)
Stay hungry, stay foolish!
![Page 74: Модерни езици за програмиране за JVM (2011)](https://reader033.vdocument.in/reader033/viewer/2022061209/548cd46eb47959672b8b4821/html5/thumbnails/74.jpg)
FIN