30 kwietnia 2012

Wywołanie funkcji w Scali inaczej

1 komentarzy
Podczas lektury Different ways of calling functions w artykule Use functional programming techniques to write elegant JavaScript z 13 czerwca 2006 trafiłem na dosyć ciekawe wywołanie funkcji, którego wcześniej nie miałem przyjemności poznać.


$ scala
Welcome to Scala version 2.10.0-M2 (OpenJDK 64-Bit Server VM, Java 1.8.0-jdk8-b35).
Type in expressions to have them evaluated.
Type :help for more information.

scala> val f = (x:Int, s:String) => s*x
f: (Int, String) => String = <function2>

scala> f(2, "a")
res0: String = aa

scala> (f) (2, "a")
res1: String = aa

scala> ((x:Int, s:String) => s*x) (2, "a")
res2: String = aa
Jeszcze nie wiem, gdzie i dlaczego chciałbym z tego skorzystać, ale moja głowa prawie eksplodowała z wrażenia! Czy to, aby nie ma związku z częściowym wywołaniem funkcji (ang. currying)?!

Po kwadransie, w którym główkowałem wciąż nad tematem...

Już wiem! Nie ma znaczenia, czy korzystam z symbolu funkcyjnego czy definicji funkcji anonimowej, która przez przypisanie do symbolu staje się nieanonimowa, owe wykonanie powyżej, w każdym przypadku po prostu wywoła funkcję. Ostatni przykład to właśnie prezentuje. Takie zagadki językowe lubię.

29 kwietnia 2012

Definiowanie symboli przez val w Scali - wartości również jako funkcje

0 komentarzy
Za 1.3 Wartości niezmienne:

"Za pomocą słowa kluczowego val można w języku Scala definiować wartości niezmienne."

Wartością może być znana programistom Javy liczba, napis lub referencja.
scala> val n = 10
n: Int = 10
Na uwagę zasługuje sposób, w jaki interpreter przedstawia wartość - n: Int = 10. Spróbuję skorzystać z tej wiedzy, aby zdefiniować n ponownie.
scala> val n: Int = 10
n: Int = 10
Być może istnieją inne sposoby deklarowania wartości, ale dla mnie wystarczy składnia
val [symbol] : [typ] = [wartość]
Za [symbol] mogę podstawić własną nazwę - identyfikator lub jak to nazywa się w Clojure - symbol. Następnie mamy [typ] i później przypisanie [wartość].

I teraz najlepsze, wartością [wartość] może być również funkcja. To jest istotna różnica między Javą a Scalą.

Moje (niewielkie) doświadczenie z F# pozwoliło mi przyswoić już sobie składnię deklaracji funkcji z symbolem implikacji =>. Po jednej stronie mamy typ danych wejściowych, a po drugiej wyjściowych. Po znaku przypisania składnia podobna, ale już definiujemy ciało funkcji, a nie jej sygnaturę (pojęcia użyte luźno, więc proszę purystów językowych o wyrozumiałość).
scala> val f:Int => Int = x => x * 3
f: Int => Int = <function1>
Proste, nieprawdaż? Wywołanie funkcji f pozostawiam Wam do samodzielnego rozgryzienia (podpowiedź: jak w Javie).

Warte spróbowania i unaocznienia pojęcia funkcji jako wartości jest wykonanie symbolu funkcyjnego (w powyższym przykładzie f).
scala> f
res15: Int => Int = <function1>
Pojawi się sygnatura funkcji, na którą wskazuje symbol (funkcyjny). Dodatkowo, od tej pory res15 jest również tym, na co wskazywał symbol f.

A na koniec inna ciekawostka: spróbuj wywołać wartość liczbową z parametrem wejściowym, np. powyższy symbol n jakby wskazywał na funkcję.
scala> n
res13: Int = 10

scala> n(2)
<console>:9: error: Int does not take parameters
              n(2)
               ^
Chciałbym napisać, że stała to również funkcja, która akceptuje zero parametrów wejściowych, ale czym różniłoby się to od funkcji bezparametrowej?! A może za bardzo chcę rozróżniać między nimi, a nie ma po co?! Jak czytam w Symbol funkcyjny:

"Wprowadzając język pierwszego rzędu najpierw określamy jego alfabet τ czyli zbiór symboli funkcyjnych, symboli relacyjnych i stałych. Każdy z tych symboli ma jednoznacznie określony charakter (tzn. wiadomo czy jest to stała, czy symbol funkcyjny, czy też predykat) i każdy z symboli funkcyjnych i predykatów ma określoną arność (która jest dodatnią liczbą całkowitą)."

co sugeruje, że nawet jeśli teoretycznie stała jest odpowiednikiem funkcji zeroargumentowej (lub odwrotnie), to faktycznie z góry wiemy, że mamy do czynienia z symbolem wskazującym na stałą lub funkcją (dowolnej arności). Trzeba mi było uważać na studiach - może wtedy takie rzeczy nie byłyby dla mnie swego rodzaju mentalnym wyzwaniem. A jakie jest Twoje zdanie w temacie? Co byłoby interesujące dla Ciebie w poznawaniu Scali?

27 kwietnia 2012

Aplikacje graficzne dynamicznie w Scali

0 komentarzy
Do Euro 2012 coraz bliżej, a ja coraz bardziej pewnie czuję się w Scali. Nie staram się poznawać tego języka zgodnie z jakimkolwiek wzorcem, a jedynie, jak coś wpadnie mi w ręce, to sobie przeczytam i popróbuję się z tym w Scala REPL. Na chwilę obecną jest więcej "popróbuję" nad "poczytam".

Zanim jednak o Scali...

Jutro (sobota, 28 kwietnia) prowadzę zajęcia w ramach Studiów podyplomowych studiów ITB (Informatyczne Technologie Biznesowe) na Wydziale Matematyki i Informatyki Uniwersytetu im. Adama Mickiewicza w Poznaniu. Będę mówił o różnych rzeczach wspieranych w ramach rodziny IBM WebSphere. I z tego powodu dotarłem dzisiaj do Poznania.

Podczas wysiadania z pociągu zobaczyłem, że pewna kobieta (nazwijmy ją roboczo KOBIETA) męczy się z dosyć sporawą walizą, więc zaoferowałem swoją pomoc. I tak się to dalej potoczyło.

JA: Czy mógłbym Pani pomóc?
KOBIETA: Nie, dziękuję. Brat mi pomoże.
JA: W porządku.

Podchodzi w tym momencie brat (roboczo nazwany BRAT) i patrzy na mnie jakoś dziwnie. Myślę sobie, gość mi zaraz spuści łomot za to, że dostawiam się do jego siostry. Wydawał się być zdeterminowany, aby to zrobić.

Po chwili, już poza pociągiem, kiedy ja zdejmowałem bluzę na pobliskiej ławce, na peronie.

Stanowczym krokiem nadchodzi brat. Myślę sobie, no to się zaczęło.

BRAT: Czy Ty jesteś Jacek?
JA: Tak. (zdumiony i prawie zlany potem)
BRAT: Czy Ty jesteś Jacek Laskowski?
JA: Tak. (coraz bardziej zaskoczony obrotem sytuacji, pamiętając o czujności)
BRAT: Znam Cię! Ja też jestem programistą!
JA: O, to miłe. Cześć!

I BRAT odszedł do KOBIETA zostawiając mnie w niezłym szoku. Ale pozbierałem się, przypomniałem sobie, że to nie szok, ale ego powinno teraz mną kierować i od razu zrobiło się przyjemniej :)

A wracając do Scali...

Dzisiaj czytając kolejny rozdział książki Real-World Functional Programming (With examples in F# and C#) zatytułowany "11. Refactoring and testing functional programs" przypomniałem sobie o Scali i jej REPL, i zacząłem zastanawiać się, czy mógłbym zbudować aplikację GUI dynamicznie, podobnie jak to miało ostatnimi czasy miejsce z Clojure. Jakież było moje zdumienie, kiedy niewiele trzeba mi było, aby coś zbudować. I pojawiło się okienko. A później przycisk.

Poniżej moja sesja. Zachęcam do samodzielnego popróbowania się z interpreterem scala, bo nie wymaga wiele, a sprawia niemało radochy. Ach, dodatkowo na portalu scala.net.pl pojawił się artykuł Grzegorza Balcerka zatytułowany "Metody i funkcje" i wiele się wyjaśniło. Bardzo pomocny artykuł! Zachęcam do spróbowania się z nim (aka "przeczytania") również. Czas nie będzie stracony. A jak się jeszcze wahasz, to możemy się umówić, że następny mój wpis ominiesz, aby mieć więcej czasu na artykuł :)
$ scala
Welcome to Scala version 2.10.0-M2 (OpenJDK 64-Bit Server VM, Java 1.8.0-jdk8-b35).
Type in expressions to have them evaluated.
Type :help for more information.

scala> import javax.swing._
import javax.swing._

scala> val frame = JFrame(title="Hello")
<console>:10: error: object javax.swing.JFrame is not a value
       val frame = JFrame(title="Hello")
                   ^

scala> val frame = new JFrame(title="Hello")
<console>:10: error: overloaded method constructor JFrame with alternatives:
  (String,java.awt.GraphicsConfiguration)javax.swing.JFrame <and>
  (String)javax.swing.JFrame <and>
  (java.awt.GraphicsConfiguration)javax.swing.JFrame <and>
  ()javax.swing.JFrame
 cannot be applied to (title: String)
       val frame = new JFrame(title="Hello")
                   ^

scala> val frame = new JFrame("Hello")
frame: javax.swing.JFrame = javax.swing.JFrame[frame0,0,22,0x0,invalid,hidden,layout=java.awt.BorderLayout,
title=Hello,resizable,normal,defaultCloseOperation=HIDE_ON_CLOSE,rootPane=javax.swing.JRootPane[,0,0,0x0,
invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,
maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]

scala> frame.setSize(200, 200)

scala> frame.setVisible(true)

scala> val btnOk = new JButton("Press me")
btnOk: javax.swing.JButton = javax.swing.JButton[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.5,
border=com.apple.laf.AquaButtonBorder$Dynamic@443385ae,flags=288,maximumSize=,minimumSize=,preferredSize=,
defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=0,left=2,
bottom=0,right=2],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=false,rolloverIcon=,
rolloverSelectedIcon=,selectedIcon=,text=Press me,defaultCapable=true]

scala> frame add btnOk
res2: java.awt.Component = javax.swing.JButton[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.5,
border=com.apple.laf.AquaButtonBorder$Dynamic@443385ae,flags=288,
maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,
margin=javax.swing.plaf.InsetsUIResource[top=0,left=2,bottom=0,right=2],paintBorder=true,paintFocus=true,
pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=Press me,
defaultCapable=true]

scala> frame pack
A później natrafiłem na twitterze wzmiankę o :reset w Scala REPL i byłem niezwykle uradowany mogąc od razu spróbować tego w działaniu. Użyteczne, nie powiem.
scala> :reset
Resetting interpreter state.
Forgetting this session history:

import javax.swing._
val frame = new JFrame("Hello")
frame.setVisible(true)
frame.setSize(200, 200)
val btnOk = new JButton("Press me")
frame add btnOk
frame pack

Forgetting all expression results and named terms: btnOk, frame

scala> frame
<console>:8: error: not found: value frame
              frame
              ^

26 kwietnia 2012

Opóźnianie wykonania w Scali

4 komentarzy
Dostałem dostęp do MEAP dla książki Functional Programming in Scala i poza lekturą bezpłatnego rozdziału wprowadzającego "Introduction", mam jeszcze możliwość przeczytania "Strictness and laziness". Na razie niewiele stron do czytania, bo jedynie 25, ale i tak poznałem stosunkowo wiele w obszarze programowania funkcyjnego ze Scalą jako językiem "wykładowym".

Tam też trafiłem na ciekawostkę opóźniania wykonania kodu w Scali, dla której w Clojure musiałbym zaprząc mechanizm makr (wciąż moją znajomość tematu określiłbym jako teoretyczną) lub utworzyć funkcję.

W języku Scala wystarczy użyć symbolu => - tego samego jak przy rozdzielaniu części funkcji - wejścia od wyjścia dla deklaracji typów i samego ciała funkcji. Brzmi pogmatwanie, ale należy to zrzucić na barki mojej niewielkiej znajomości tematu. Przykład powinien rozjaśnić zagadnienie.

Pytanie rozgrzewające: "Czy potrafisz wskazać element(y) języka Java, które pozwala na warunkowe wykonanie kodu?" Chętnie poznam Twoją odpowiedź - skorzystaj z możliwości komentowania.

W Scala sprawa przedstawia się jak poniżej. Uruchamiamy interpreter Scali - scala i do dzieła.
scala> def laaazy(x: => Int): Int = { println("Inside laaazy"); x}
laaazy: (x: => Int)Int

scala> laaazy({ println("Input argument"); 5 })
Inside laaazy
Input argument
res16: Int = 5

scala> def laaazy(x: Int): Int = { println("Inside laaazy"); x}
laaazy: (x: Int)Int

scala> laaazy({ println("Input argument"); 5 })
Input argument
Inside laaazy
res17: Int = 5
Czy potrafisz wskazać owe szczególne miejsce w powyższej sesji do opóźnienia wykonania? Zwróć uwagę na kolejność występowania napisów "Inside laaazy" praz "Input argument". Ciekawe, co? A jak zrealizował(a)byś to w Javie?

25 kwietnia 2012

Sprawdź TAB w interpreterze scala

2 komentarzy
Czas biegnie nieubłaganie i coraz częściej doświadczam olśnienia właściwego przeznaczania czasu na rzeczy, które mają dla mnie znaczenie (zamiast na takie, które jedynie przez krótki moment wydają się być wartościowe). Widzę to chociażby na przykładzie moich dzieciaków, szczególnie tego najmłodszego, ale również i najstarszej. Pierwszy może pochwalić się pierwszym ząbkiem (poza innymi nowinkami, którymi obdarza nas właściwie każdego dnia), a druga ukończoną 18tką (!) Jak ten czas leci! Kiedy dodać do tego "zabawę" w egzamin gimnazjalny u drugiego syna, czasu zdecydowanie nie starcza na wszystkie uciechy.

Mimo to, nie poddaję się ze Scalą i wykorzystując czas w drodze do pracy komunikacją miejską udało mi się przejść przez darmowy rozdział Functional Programming in Scala. Nie zamierzam się rozpisywać na jej temat, bo można krótko: "Polecam!" Jeśli tylko autorzy utrzymają narrację, zapowiada się naprawdę wyśmienita książka. Każdemu początkującemu w programowaniu funkcyjnym polecam, a jako, że przykłady będą w Scali, to zainteresowanym tym językiem przede wszystkim. W zasadzie trudno wyobrazić mi sobie programistę dowolnego poziomu, który nie skorzystałby z lektury tej książki. Chociaż, jeśli się zastanowić, to jest to wrażenie po jednym rozdziale, który koniec końców nie jest zapewne jeszcze nawet w finalnej wersji. Nadzieja jest i poprosiłem Manning o dostęp do MEAP. Właśnie dostałem odpowiedź, że zgoda jest. Będzie okazja dostąpić zaszczytu przeczytania kolejnego rozdziału "Strictness and laziness".

Jako, że próbuję ukończyć lekturę innej książki o programowaniu funkcyjnym, tyle że w F# - Real-World Functional Programming (With examples in F# and C#), to Scali nie poświęcam tyle czasu, ile chciałbym. Nie zapominam również o Clojure, któremu poświęciłem wszystkie moje publiczne wystąpienia w 2012 do tej pory. A jest jeszcze planowanych kilka (niektóre jeszcze niepotwierdzone) - GeeCON, spotkanie na Warszawa JUG, podobnież Softdevcon, jar.camp(), podobnież Eclipse DemoCamp w Poznaniu i Warszawie, oraz planowane wspólne wystąpienie z Grzegorzem B. na Confiturze. Jeszcze będzie spoooro tego Clojure w moim życiu. Konrad Garus utwierdza mnie w przekonaniu, że nawet uda mi/nam się coś w Clojure napisać - zachęcam do udziału w zabawie w projekcie librarian-clojure.

Kiedy jednak zasiadam przy kompie, zaczynam od odrobiny Clojure, a później szczypty Scali. Jest to o tyle łatwe, że wystarczy uruchomić lein2 repl, aby doświadczyć przyjemności pracy z Clojure, a scala, aby skorzystać z interpretera Scali.

I tak bodajże wczoraj zasiadłem przy Scali i kiedy zacząłem wpisywać kawałki kodu javowego, jakoś niechcący skorzystałem z klawisza tabulacji. Jakież było moje zdumienie, kiedy dla typów z dopiero co zaimportowanego pakietu java.net (import java.net._) zacząłem dostawać w odpowiedzi dostępne klasy, a później nawet i ich składowe - metody i pola. Trzeba było widzieć moją minę, kiedy uzmysłowiłem sobie siłę środowiska Scala, w którym mogłem śmiało wpisywać wyrażenia javowe, które wcześniej wymagały ode mnie pracy w IDE - nie zawsze zgodnie z moimi potrzebami.

Spróbuj samemu/-ej. Wystarczy pobrać dystrybucję Scali, uruchomić interpreter scala i zacząć od importu wybranego pakietu. Wtedy TAB i voila. Próg wejścia bardzo obniżony mając do dyspozycji bardzo dynamiczne środowisko, w którym odpowiedź jest natychmiastowa. To lubię!

p.s. Wciąż nie mogę oduczyć się rozpoczynania od nawiasu, kiedy widzę środowisko scala. Czarne tło interpretera Scali nie sprzyja koncentracji?

22 kwietnia 2012

scala> lazy val days2Euro2012 = 47

2 komentarzy
Słoneczna niedziela nie sprzyjała głębszej nauce, więc skończyło się na przejrzeniu forum książki o programowaniu funkcyjnym w języku Scala - Functional Programming in Scala. Niewielka liczba wątków zachęcała do krótkiego rekonesansu do Scali przez pryzmat dyskusji w temacie jej funkcyjnej strony.

W Function representation in Scala trafiłem na:
val add:(Int, Int) => Int = (x,y) => x + y
podczas gdy większość przykładów, które do tej pory napotkałem definiowały funkcję jak poniżej:
def add(x: Int, y: Int): Int = x + y
Niby nic odkrywczego, ale przywołały mi różnicę między funkcjami a symbolami (aka vars), które wskazują na funkcje w Clojure. W programowaniu funkcyjnym funkcje są pierwszej kategorii, więc można je przypisywać, akceptować na wejściu do funkcji i zwracać jako wyjście. Dokładnie tak, jak ma to miejsce w Javie z obiektami, co pozwala nazwać Javę obiektowym językiem.

Również w Thread: Code in book as transcript in REPL pojawiła się ciekawa cecha Scala REPL:
scala> scala> println("Hello, World!")

// Detected repl transcript paste: ctrl-D to finish.

Hello, World!
// Replaying 1 commands from transcript.

scala> println("Hello, World!")
Hello, World!
Wystarczy wkleić dowolną kombinację powyższych linii i REPL wykryje, że wkleiliśmy kawałek kodu, który był prezentowany jako wynik działania REPL. Użyteczna cecha scalowego REPLa. Trochę pokręcone przy próbie wytłumaczenia, więc zachęcam do samodzielnego popróbowania się z tym.

Jeszcze trafiłem na słówko lazy, które jak łatwo było się domyśleć ma służyć opóźnieniu wykonania obliczenia.
scala> lazy val a = 4 + 4
a: Int = <lazy>

scala> a
res13: Int = 8
Nie spędziłem specjalnie wiele czasu na poszukiwania i poprzestanę na poniższym, aby uzmysłowić leniwe obliczenie.
scala> lazy val b = { println("Ala ma kota"); }
b: Unit = <lazy>

scala> b
Ala ma kota
Gdyby usunąć lazy wykonanie przypisania będzie wykonane natychmiast i wyświetli się napis "Ala ma kota", tak jak wykonanie b z lazy powyżej.

Na zakończenie, czytając player/winner typo, zwróciłem uwagę na
if (p1.score > p2.score) declareWinner(p1) else declareWinner(p2)
które powtarza wywołanie funkcji declareWinner. Sądzę, że możnaby zamienić to na reduce. W Clojure już mam, pracuję nad wersją w Scali. Może ktoś pomoże?

Poniżej kod w Clojure. Uzmysławia stosowanie mapy jako jednej z podstawowych struktur danych (coś ala javowy obiekt) oraz map i reduce - filary programowania funkcyjnego w Clojure.
$ lein2 repl
nREPL server started on port 55072
Welcome to REPL-y!
Clojure 1.3.0
    Exit: Control+D or (exit) or (quit)
Commands: (help)
    Docs: (doc function-name-here)
          (find-doc "part-of-name-here")
  Source: (source function-name-here)
          (sourcery function-name-here)
 Javadoc: (javadoc java-object-or-class-here)
Examples from clojuredocs.org:
          (clojuredocs name-here)
          (clojuredocs "ns-here" "name-here")
nil
user=> (def players {:p1 10 :p2 20 :p3 15 :p4 8 :p5 2})
#'user/players
user=> (defn pme [me] [(me 0) (me 1)])
#'user/pme
user=> (map pme players)
([:p1 10] [:p3 15] [:p2 20] [:p4 8] [:p5 2])
user=> (defn >me [me1 me2]
         (if (> (val me2) (val me1)) me2 me1))
#'user/>me
user=> (reduce >me players)
[:p2 20]
user=> (defn declareWinner [[name score]]
         (format "Player %s won (score: %s)" name score))
#'user/declareWinner
user=> (declareWinner
         (reduce >me players))
"Player :p2 won (score: 20)"
Proszę pytać, jak coś niejasne. Chętnie udzielę odpowiedzi.

21 kwietnia 2012

scala> (-48 to Euro2012)

8 komentarzy

Lektura Functional Scala: Introduction pozwoliła mi ułożyć sobie w głowie koncepcję programowania funkcyjnego. Mimo ukierunkowania autora na Scalę, prawie żadna z części nie wskazywała na jakikolwiek związek z tym językiem. Wystarczy 30 minut skupienia i zrozumienie cech paradygmatu funkcyjnego powinno być jaśniejsze. Mi pomogło znacznie.

Najbardziej płodną sekcją artykułu była końcówka Stateless vs. Stateful, w której dotarło do mnie, że:

Skutek uboczny jest sposobem na przechowanie tymczasowego wyniku obliczeń na potrzeby innych części aplikacji. W programowaniu funkcyjnym zmienne nie istnieją, więc jedynym sposobem na przekazanie wyniku obliczeń jest użycie rekurencji (przekazywanie wyniku funkcji samej sobie) lub zwrócenie go (przekazanie wyniku innym funkcjom).

Podczas lektury miałem uruchomioną konsolę scala i bawiłem się poznanymi konstrukcjami. Nie zagłębiam się w lekturę składni Scali, więc idzie mi jak po grudzie i próbuję odgadywać, jak mogłoby dane wywołanie wyglądać. Najbardziej zaskakujące jest, że bezwiednie wpisuję wywołania w składni Clojure - zaczynam nawiasem! Stało się to dla mnie naturalne! Całkowicie przestawiłem swoje myślenie na "wszechobecne funkcje" w Clojure na "metody są przypisane do obiektów" w Scali. Scala wymusza u mnie przestawienie się na myślenie obiektowe z dodatkiem funkcyjnym.

Poniżej wycinek moich wyczynów scalowych. Samo środowisko często samo z siebie podpowiada co mogłoby być właściwe w danym kontekście. Bajka!
$ scala
Welcome to Scala version 2.10.0-M2 (OpenJDK 64-Bit Server VM, Java 1.8.0-jdk8-b29).
Type in expressions to have them evaluated.
Type :help for more information.

scala> (1 to 9)
res0: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9)

scala> Range(1, 4)
res1: scala.collection.immutable.Range = Range(1, 2, 3)
Zwróć uwagę na sufix Inclusive przy nazwie klasy, która obsługuje pierwszy przykład vs drugi.
scala> (0 to 10).foldLeft(0)
<console>:8: error: missing arguments for method foldLeft in trait TraversableOnce;
follow this method with `_' if you want to treat it as a partially applied function
              (0 to 10).foldLeft(0)
                                ^

scala> (0 to 10).foldLeft(0)_
res3: ((Int, Int) => Int) => Int = <function1>

scala> val fl = (0 to 10).foldLeft(0)_
fl: ((Int, Int) => Int) => Int = <function1>

scala> fl(_+_)
res4: Int = 55

scala> val fl = (0 to 10).reduceLeft_
<console>:7: error: value reduceLeft_ is not a member of scala.collection.immutable.Range.Inclusive
       val fl = (0 to 10).reduceLeft_
                          ^

scala> val fl = (0 to 10).reduceLeft _
fl: ((Int, Int) => Int) => Int = <function1>

scala> fl(_+_)
res5: Int = 55

20 kwietnia 2012

Scala w 49. dzień do Euro 2012

3 komentarzy

Wczoraj na forum Warszawa JUG zaproponowałem pewną zabawę skojarzoną z upływającym czasem do Euro 2012 - 50 dni do Euro 2012 - idealnie, aby zaczać naukę.... Celem zabawy jest "nauki technologii, którą zwykle mianował TODO."

Mamy 50 dni (wczoraj) i ciekawie będzie móc zasiąść przed ekranem telewizora wiedząc, że przygotowania do tej pozycji były związane z nauką czegoś nowego. Możnaby wtedy świętować nie tylko rozpoczęcie mistrzostw, ale ukończenie rozpoznania czegoś, co warte było 50 dni.

Ja postawiłem na funkcyjne oblicze języka programowania Scala. Niech to będzie mój udział w ogólnopolskim wyścigu ku Euro 2012. Piłka mnie nie kręci, ale Scala już tak. Mam nieodparte wrażenie, że zrozumienie programowania funkcyjnego w Scali pomoże mi znacznie podnieść swój warsztat i w Clojure.

Dzisiaj zacząłem skromnie od pobrania dystrybucji języka Scala 2.10.0-M2 i po przejrzeniu Chapter 2 of Programming in Scala, First Edition "First Steps in Scala" uruchomieniu środowiska scala.
$ scala
Welcome to Scala version 2.10.0-M2 (OpenJDK 64-Bit Server VM, Java 1.7.0-jdk7u4-b19).
Type in expressions to have them evaluated.
Type :help for more information.

scala> println("Hello")
Hello
Obejrzałem prezentację Guerrilla Guide to Pure Functional Programming i popróbowałem się z kilkoma wyrażeniami ze slajdów. Można żyć z tym systemem typów.

Teraz nie pozostaje mi nic innego jak rozpocząć projekt. Chciałbym stworzyć coś w czystej Scali, bez konieczności poznawania dodatkowych bibliotek, czy szkieletów aplikacyjnych i mam nieodparte wrażenie, że najbardziej odpowiednia byłaby jakaś aplikacja desktopowa. Boję się Lifta jako sposobu na wejście w Scalę i stąd te poszukiwania.

19 kwietnia 2012

4Developers 2012 w Poznaniu za nami

2 komentarzy
Niech podsumowaniem mojej bytności na 4Developers w Poznaniu, w roli prelegenta o Clojure będzie poniższa wiadomość, którą dostałem od mojego ziomka z Torunia, którego poznałem właśnie podczas konferencji.

"Moje wrażenia o Closure opiszę Ci później, ale jedno mogę Ci od razu napisać. Przejrzałem w drodze powrotnej do Torunia kilka Twoich wpisów na blogu i już mnie tak nie odrzuca ;)"

Czyż to nie piękne?!

Kolejnym miłym podsumowaniem niech będzie inna wiadomość z twittera od nowakera (cóż za rym!):

"Three hours of #Clojure hacking with @jaceklaskowski at #4developers. I'm convinced - finally!"

Dodatkowo pochlebne opinie o Clojure i jego użyteczności od Jakuba Nabrdalika, z którym spędziłem kilka godzin w pociągu powrotnym do Warszawy i mam wrażenie, że zbudowałem grono osób zaintrygowanych możliwościami Clojure. Nie chodzi o to, aby kogoś ewangelizować o wyższości Clojure nad innymi językami (w szczególności Java), ale o zaproponowanie miejsc i/lub prezentacji cech języka, których dostępność może być przydatna. Mam wrażenie, że jest ich kilka, a aplikacje webowe świetnie się do tego nadają (zaczynam to *powoli* rozumieć).

Gdybym w ten sposób kończył wszystkie moje konferencje byłbym wniebowzięty. Zadowolenie rozmówców i uczestników moich wystąpień publicznych (które ostatnio przybrały formę programowania na żywo) jest największą nagrodą. Po prostu bezcenne!

O samej konferencji możnaby pisać wiele i długo, ale pozostanę przy telegraficznym skrócie i niech żałują Ci, którzy przedkładając inne aktywności nad możliwość zamienienia słowa z kolegami z branży nie uczestniczyli w konferencji. Shame on you!

Dla zwrócenia uwagi, uczestniczyłem w roli prelegenta i moje zadowolenie jest zgoła odmienne od osób, które pośrednio lub bezpośrednio płacili za możliwość udziału. Ja otrzymałem do dyspozycji platformę prezentacji dotychczasowej wiedzy o Clojure, spotkałem wiele osób, których do tej pory nie miałem przyjemności spotkać, ani dowiedzieć się o ich istnieniu, oraz rozmawiałem ze starymi, dobrymi znajomymi. Wszystko bezpłatnie (nie wliczając w to własnego czasu), a to sprawia, że 4Developers 2012 wchodzi na listę imprez wartych wspomnień (i nowych planów rozwojowych, w których, obok Scali, zaczyna znajdować swoje miejsce...Erlang!)

Jednego jestem pewien, dostrzegam formowanie się grupy entuzjastów technicznych, którzy widzą sens w uczestniczeniu w konferencjach jako koła napędowego własnego rozwoju osobowego (aka "kariery") bez względu na ich wcześniejszy poziom i rangę. Koniec końców, poza samą treścią jest jeszcze strona społecznościowa - budowanie znajomości i wymiana poglądów za kulisami. Uwielbiam to!

Z niecierpliwością czekam na GeeCON oraz Confiturę!

02 kwietnia 2012

Dynamic web applications with Clojure and Ring - part 1

0 komentarzy
Przygotowania do konferencji devcrowd.pl w Szczecinie, 14 kwietnia idą pełną parą. Wiem wystarczająco dużo, aby zapełnić nie pojedynczą jednogodzinną sesję Użycie Clojure w aplikacjach webowych, ale całą ścieżkę i trochę żałuję, że nie zaproponowałem serii na podobieństwo do Łukasza Scali. Następnym razem.

Warto jednak wszystko sobie poukładać, aby materiał na konferencję był dobrze ułożony i dopasowany do wymagań sesji. W końcu 1 godzina to dla wielu aż jedna godzina, podczas gdy dla mnie zwykle jest to po prostu chwila, którą przeznaczam na...wstęp. I to właśnie jest zwykle podnoszone jako wada moich publicznych wystąpień. Koniec z tym. Albo sobie poradzę z problemem niedopasowania w czasie, albo...no cóż, wciąż pracuję nad tą częścią - wersją alternatywną :)

Celem uporządkowania i pewnego zachęcenia do udziału w mojej prezentacji spisuję swoje doświadczenia na angielskojęzycznym blogu Japila :: verba docent, exempla trahunt i ożywiam Wiki.

Oddaję Tobie nowy artykuł wprowadzający do tworzenia aplikacji webowych z narzędziami Leiningen oraz Ring. One są podstawowymi narzędziami pracy twórcy aplikacji webowych w Clojure i ich znajomość jest obowiązkowa (coś ala znajomość servletów w Java EE). Masz kilka minut na poznanie nowego? Zapraszam do lektury Dynamic web applications with Clojure and Ring - part 1.

Proszę o komentarze naprowadzające na właściwe tory, gdyby ktoś zauważył coraz intensywniejszy dryf. Pochwały również mile widziane.