Garść linków do debaty o językach dynamicznych i Scali

napisane przez wiktor, 21:28 01-24-2008

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.

Poznajemy nowe języki: Scala, czyli jak wypisać elementy z listy

napisane przez wiktor, 17:39 12-12-2007

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:
  1. List<Integer> lista = new ArrayList<Integer>() {{
  2.    add(1); add(2); add(3); add(4);
  3. }};
  4.  
  5.  
  6. for (Integer x : lista)
  7.     System.out.println(x);
  8.  
  9. // Można też tak, ale raczej nie bym nie polegał na metodzie toString()
  10. System.out.println(lista.toString());
  11.  
  12. // lub po prostu:
  13. System.out.println(lista);

Dla odmiany w Ruby'im zrobilibyśmy to tak:

RUBY:
  1. # tutaj akurat mamy tablicę
  2. lista = %w(1, 2, 3, 4)
  3.  
  4. # żeby ładnie było to definiujmy println
  5. println = lambda { |x| puts x }
  6.  
  7. lista.each &println

Zobaczmy teraz, jak zrobilibyśmy to w Scali.

SCALA:
  1. val lista = List(1, 2, 3, 4)
  2.  
  3. lista.foreach((x: Int) => println(x))

Brzydko... idziemy dalej. Scala jest językiem funkcyjnym, który ma mechanizm currying. Opuśćmy deklarację typu i nawiasy.

SCALA:
  1. lista.foreach(x => println(x))

Nadal brzydko... idziemy dalej. Co jest argumentem metody foreach? Sygnatura metody jest następująca:

SCALA:
  1. def foreach(f: A => Unit): Unit

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:
  1. def println(x: Any) = Console.println(x)

czyli bierze jakiś argument (nadal patrz: currying, funkcje wyższego rzędu) i zwraca Unit. Zatem typy się zgadzają. Zapiszmy to krócej:

SCALA:
  1. lista.foreach(println)

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:
  1. lista foreach println

Piękny zapis, nieprawdaż? :) A czy twój ulubiony język zrobi to lepiej?


Wiktor Gworek Nazywam się Wiktor Gworek i jestem gospodarzem tego bloga.
Przeczytaj więcej o mnie »