Posted by wiktor on Jan 24, 2008 in
java,
ruby,
scala
Widzę, że jesteś pierwszy raz na moim blogu. Witaj :). Może nawet będziesz miał ochotę subskrybować blog poprzez RSS. Trzymaj się ciepło!
Dziś dość króciutko. Tylko linki, ale za to bardzo smakowite.
- Can Dynamic Languages Scale?
Notka na TheServerSide dotycząca niepowodzenia projektu Chandler wywołała bardzo ciekawą dyskusję. Treść niusa nie jest istotna, tylko komentarze. Znajdziemy tam wszystko: obrzucanie się błotem, argumenty ad personam, tezy niczym nie podparte, czyli genialną i kulturalną dyskusję
. Uwaga! Występują tam celebryci ze światka developerskiego: Bill Burke i Cedric Beust. Nieprawdaż, że brakuje serwisu pudelek.developers.com?
- Invasion Of The Dynamic Language Weenies
Dość dobra rozprawa o językach dynamicznych o bardzo prowokacyjnym tytule. Dobra lektura – tylko troszeczkę stronnicza
. Warto poświęcić trochę czasu na poczytanie odnośników z linkografii do wpisu.
- The busy Java developer’s guide to Scala
Tytuł mówi sam za siebie. Ted Neward, znany gawędziarz na wielu konferencjach, barwnym językiem opisuje pierwsze kroki ze Scalą. Miła czytanka.
Posted by wiktor on Dec 12, 2007 in
java,
scala
Scala. Co to za język?
- Scala została sklasyfikowana jako język funkcyjny, obiektowy, wielo-paradygmatyczny (mam nadzieję, że dobrze tłumaczę),
- statycznie i silnie typowany,
- obecna implementacja bazuje na JVM, niedługo można się spodziwać implementacji na .NET,
- tak!, Scala działa na platformie Java, więc ma dostęp do całego ekosystemu bibliotek Javy,
- nietuzinkową postacią jest sam twórca języka Martin Odersky, który jest współautorem obecnego kompilatora Javy oraz jest współprojektantem obecnych typów generycznych w Javie,
- jest to młody język programowania i posiada wiele ciekawych własności, o których to będę pisał w kolejnych postach,
- więcej: Scala na Wikipedii, strona domowa Scali, wywiad z twórcą języka.
OK, wezmę na warsztat prostą czynność: wypisanie elementów z listy.
Kod w Javie byłby następujący:
[Java]
List lista = new ArrayList() {{
add(1); add(2); add(3); add(4);
}};
for (Integer x : lista)
System.out.println(x);
// Można też tak, ale raczej nie bym nie polegał na metodzie toString()
System.out.println(lista.toString());
// lub po prostu:
System.out.println(lista);
[/Java]
Dla odmiany w Ruby’im zrobilibyśmy to tak:
[Ruby]
# tutaj akurat mamy tablicę
lista = %w(1, 2, 3, 4)
# żeby ładnie było to definiujmy println
println = lambda { |x| puts x }
lista.each &println
[/Ruby]
Zobaczmy teraz, jak zrobilibyśmy to w Scali.
[Scala]
val lista = List(1, 2, 3, 4)
lista.foreach((x: Int) => println(x))
[/Scala]
Brzydko… idziemy dalej. Scala jest językiem funkcyjnym, który ma mechanizm currying. Opuśćmy deklarację typu i nawiasy.
[Scala]
lista.foreach(x => println(x))
[/Scala]
Nadal brzydko… idziemy dalej. Co jest argumentem metody foreach? Sygnatura metody jest następująca:
[Scala]
def foreach(f: A => Unit): Unit
[/Scala]
Na potrzebę chwili traktujmy Unit tak samo jak void. Zatem argumentem foreach jest funkcja, która przyjmuje argument A (jakiś nieustalony typ, patrz: currying) i zwraca Unit. Natomiast println jest zdefiniowany tak:
[Scala]
def println(x: Any) = Console.println(x)
[/Scala]
czyli bierze jakiś argument (nadal patrz: currying, funkcje wyższego rzędu) i zwraca Unit. Zatem typy się zgadzają. Zapiszmy to krócej:
[Scala]
lista.foreach(println)
[/Scala]
Już lepiej, ale można jeszcze lepiej
. Scala ma bardzo fajną własność, którą nigdzie wcześniej nie spotkałem. Mianowicie w Scali technicznie nie ma operatorów. Wyrażenie 1 + 2 jest tożsame z wywołaniem metody 1.+(2). Jeśli metoda przyjmuję tylko jeden parametr to można pominąć nawiasy oraz kropkę. Zatem:
[Scala]
lista foreach println
[/Scala]
Piękny zapis, nieprawdaż?
A czy twój ulubiony język zrobi to lepiej?