Nawiasem mówiąc:
Clojure

Daniel Janus

java4people, 16 kwietnia 2011

Agenda

Czekając na JSR

Newsgroups: pl.comp.lang.java
Subject: Java: Czego mi brak: Operator warunkowy
Date: Mon, 8 Dec 2008 07:08:32 -0800 (PST)

A więc brakuje mi operatora który by działał jak '.' z małym wyjątkiem 
jeśli nadrzędny obiekt byłby null-em, wówczas null byłby zawsze 
zwracany. 

public static LockMode getLockModeSuggested(SomeHouse someHouse) {
   return someHouse.?.mainEntry.?.reallyGoodLock.?.lockMode;
}
      

Transformacja

return getObject().?.getField().?.getSubfield();
      

Object tmp = getObject();
if (tmp == null) {
   return null;
} else {
   Object tmp2 = tmp.getField();
   if (tmp2 == null) {
      return null;
   } else {
      return tmp2.getSubfield();
   }
}
      
Z czego składa się deklaracja zmiennej?
  • typ
  • nazwa
  • wyrażenie inicjalizujące
Z czego składa się instrukcja warunkowa?
  • warunek
  • instrukcja gdy warunek spełniony
  • instrukcja gdy warunek niespełniony
Z czego składa się instrukcja return?
  • wyrażenie do zwrócenia

Inna notacja

(return (.?. (getObject) (getField) (getSubfield)))
        

(declare Object tmp (getObject))
(if (== tmp null)
  (return null)
  (block
    (declare Object tmp2 (. tmp (getField)))
    (if (== tmp2 null)
      (return null)
      (return (. tmp2 (getSubfield))))))
      
To jeszcze nie Clojure, to wciąż Java (w przebraniu)!

Kod czy dane?

Jedno i drugie

Gdyby tak dało się automatycznie zamieniać jedno na drugie...

Da się!

(defmacro .?. 
  ([x y] `(. x y))
  ([x y & args]
    `(block
       (declare Object tmp# ~x)
       (if (== tmp# null)
         (return null)
         (.?. ~y ~@args)))))
        

Clojure — programowalny język programowania

Wyrażenia

Formuły: budulec programów

Read-Evaluate-Print Loop
(REPL)

> (+ 2 3)
5
> (defn funkcja [x]
    (if (< x 100)
      "mała liczba"
      "duża liczba")))
#'user/funkcja
> (funkcja 4983)
"duża liczba"
        

Mapy

{klucz1 wartość1 
 klucz2 wartość2 
 ...
 kluczN wartośćN}

Klucze (keywords)

Wektory

Zbiory

Sekwencje

Funkcje wyższego rzędu


(map add-42 [1 2 3])
(43 44 45)

(filter even? (range 10))
(0 2 4 6 8)
        

Leniwość

Funkcje anonimowe


(map (fn [x] (+ x 42)) [1 2 3])
(43 44 45)

(map #(+ % 42) [1 2 3])
(43 44 45)
        

Wołanie metod Javy

(.toUpperCase "Hello")
"HELLO"

(.freeMemory (Runtime/getRuntime))
21528704

(javax.swing.JOptionPane/showMessageDialog nil "Hello!")

        

Software Transactional Memory

Ekosystem

Pułapki

Case-study: Fablo

Fablo

Fablo

HTTP: Ring

HTTP jako funkcja
żądanie → odpowiedź

Request


:server-port  :uri
:server-name  :query-string
:remote-addr  :request-method
:scheme       :content-type
:headers      :content-length
:body         :character-encoding
        

Response


:status
:headers
:body
        

Pytania?

Dziękuję za uwagę!


(doseq [you (audience)]
  (thank! you))    
        

http://plblog.danieljanus.pl
http://fablo.pl