sobota, listopada 14, 2009

Erlang, Clojure, Scheme i inne...

Od kilku miesięcy przyzwyczajam głowę (a właściwie jej najbardziej odporną na zmiany część, czyli było nie było - mózg) do nowego spojrzenia na programowanie, myślę oczywiście o deklaratywnym modelu programowania w językach funkcyjnych. Zacząłem od Erlanga, książka była pod ręką więc było mi najprościej (sic!), szybko jednak dostrzegłem braki i sięgnąłem po dwa świetne podręczniki (jeden opisuje w jakiejś części język Scheme - "How to Design Programs", w polskiej wersji tutaj, drugi to znacznie bardziej teoretyczna praca, w której autorzy przedstawiają modele programistyczne na podstawie języka MozartOz - "Concepts, Techniques, and Models of Computer Programming" także dostępna w polskiej wersji tutaj.
Przyznam szczerze, że o ile How to Design Programs czyta się dość dobrze i wprowadzenie do programowania funkcyjnego jest w niej dość praktycznie zrealizowane o tyle druga z książek jest większym wyzwaniem.
W każdym razie uzbrojony w wiedzę z pierwszej i pobieżnie (mój błąd) zaczerpniętą z drugiej sięgnąłem po Erlang. Tutaj jest nieco inaczej niż w Scheme czy Mozarcie ale wciąż deklaratywnie i funkcyjnie :). Program powolnie powstaje i mam nadzieję, że okaże się niezawodny i odporny na błędy (choć wiem, że obie właściwości są raczej średnią włożonej w projekt i implementację oraz doświadczenia zespołu [[także z samym językiem, w którym program jest implementowany]]). Tymczasem w ręce wpadła mi kolejna książka o kolejnym funkcyjnym języku - Clojure a że autor języka Rich Hickey twierdzi, że to tak naprawdę tylko nowy Lisp a Paul Graham, że Lisp jest najpotężniejszym językiem nie pozostało nic innego jak przystąpić do pracy :)
Pierwsze wrażenia są raczej pozytywne choć nie jest łatwo. Słaba (tak mi się przynajmniej wydaje - jestem przyzwyczajony do dokumentacji Javy), mimo niewątpliwego wysiłku twórcy/twórców, dokumentacja nieco utrudnia początki. Jednak cel jest więc popracuję. Na początek moje Clojurowe tłumaczenie jednego z przykładów z książki Programming Erlang:

* Erlang (str 45 w książce)

Fruit = [apple, pear,orange]
MakeTest = fun(L) -> (fun(X) -> lists:member(X,L) end) end
IsFruit= MakeTest(Fruit)

IsFruit(pear) %% true
IsFruit(apple) %% true
IsFuite(dog) %% false

* Clojure

(def Fruits #{"Apple", "Pear", "Orange"})
(defn MakeTest [L] (fn [X] (contains? L X)))
(def IsFruit (MakeTest Fruits))

(IsFruit "Pear") ; true
(IsFruit "Apple") ; true
(IsFruit "Dog") ; false

* Scheme

(define Fruits (list "Apple" "Pear" "Orange"))
(define make-test
(lambda(L)
(lambda(X)
(member X L))))

(define is-fruit (make-test Fruits))
(is-fruit "Apple") ; true
(is-fruit "Pear") ; true
(is-fruit "Dog") ; false


Będę dalej wrzucał moje clojurowe wersje (czasami także scheme'owe jak w tym wypadku). W razie potrzeby mogę - w miarę moich skromnych możliwości - pomóc uruchomić te przykłady.

Brak komentarzy: