Slide 1

Slide 1 text

Clojure'a Giriş* Kasım 2015 Üstün Özgür * Bu sunumda Rich Hickey'nin özgün Clojure for Java Programmers sunumu temel alınmıştır.

Slide 2

Slide 2 text

Clojure Felsefesi • Java Virtual Machine üzerinde çalışan dinamik bir dil • Derlenen (compiled) bir dil • Bir Lisp dialekti. Lisp'in veri olarak kod (code-as- data) felsefesi ve makro desteği. • Fonksiyonel programlama ağırlıklı. Immutable, persistent veri yapıları. Mutable state için transactional hafıza sistemi

Slide 3

Slide 3 text

Tarihçe • 2007'de Rich Hickey tarafından açıklandı • JVM ve CLR üzerinde başladı, 2011'de ClojureScript açıklandı • Ekim 2012'de Thoughtworks Technology Radar'ında Adopt fazına alındı. • Ana kullanıcı şirketler: Walmart Labs (Runa), Cognitect, Thoughtworks, Backtype (Twitter tarafından satın alındı, Storm ve Cascalog'un yaratıcısı) • Hickey'nin "Simple Made Easy", "Are We There Yet?", "Hammock Driven Development" konuşmaları Clojure'dan bağımsız olarak programlama açısından büyük önem taşıyan konuşmalardır.

Slide 4

Slide 4 text

• Temeller • Sözdizim (syntax) • Diziler (Sequences) • Java entegrasyonu

Slide 5

Slide 5 text

Clojure Temelleri • Dinamik • Fonksiyonel • Değişmeyen veri yapıları • JVM üzerinde çalışan • Açık kaynak

Slide 6

Slide 6 text

Dinamik dillerin avantajları • Daha esnek • Deneylere daha açık: deneme yanılma • Daha kısa ve öz • Problem odaklı

Slide 7

Slide 7 text

Dinamik diller • Başka dillerin JVM portları • JRuby, Jython • JVM için yazılmış diller • Groovy, Clojure

Slide 8

Slide 8 text

Neden Clojure? • Kısa ve öz programlar, Lisp • Java'ya yakın performans ve kolay Java entegrasyonu • Fonksiyonel programlama ve concurrency

Slide 9

Slide 9 text

Dinamik Geliştirme • REPL - Read Eval Print Loop • Kodu anında tanımlama ve deneme • İnteraktif ortam

Slide 10

Slide 10 text

Temel Veri Türleri • Sayılar (tam, ondalıklı, kesirli) 123 1.23 3/4 • String "Ankara" Karakter \a \b • Semboller ahmet mehmet • Keywordler :ahmet :mehmet • Boolean true false nil • Regex #"\d{3}" #"ab?"

Slide 11

Slide 11 text

Veri Yapıları • List: linked list, öne eklenir • (3 4 5) (ahmet mehmet) (list 1 2 3) • Vector: random access, sona eklenir • [3 4 5] [ahmet mehmet] • Maps : key-value, dictionary • {:ad "Ustun" :soyad "Ozgur"} • {6 "Ankara" 34 "Istanbul"} • Kümeler • #{"Besiktas" "Fenerbahce" "Galatasaray"}

Slide 12

Slide 12 text

Veri Yapıları • Bütün bu yapılar iç içe geçebilir: • {:ad "Ustun" :soyad "Ozgur" 
 :hobileri #{"Programlama" "Clojure"}
 :bildigi-diller ["Python" "JavaScript" "Clojure"]} • [{:id 1 :isim "Besiktas" :kadro [...]}
 {:id 2 :isim "Fenerbahce" :kadro [...]}

Slide 13

Slide 13 text

Syntax kuralları • (operator ....) • (+ 3 4 5) • (* 3 4 5) • (def x 3) Operator türleri • Fonksiyon • Makro • Özel form

Slide 14

Slide 14 text

Özel Formlar • Argümanların evaluation'ı özel kurallara tabi • (def isim değer) ; global değişken • (if condition first-rule second-rule) • sadece birini evaluate eder. • Çok az sayıda özel form • fn let loop recur do new . throw try set! quote var

Slide 15

Slide 15 text

Makrolar • Sözdizimsel şeker (Syntax sugar) eklemek için • Kullanıcı tarafından eklenebilir • Çoğu dilde syntax olarak tanımlanması gereken yapılar Lisplerde macrolar ile kullanıcılar tarafından eklenebilir. • Makro fonksiyonuna argumanlar veri olarak girer, makro bunu işler ve yeni bir veri yapısı döndürür • (if-not condition first-expr second-expr) • (if (not condition) first-expr second-expr) • Aslında çok basit. HTML template oluşturmak gibi.

Slide 16

Slide 16 text

Fonksiyonlar • Birinci sınıf, aynı sayılar ve stringler gibi • (def dort 4) • (def square (fn [x] (* x x)) • (square 4) ;; 16 • Mapler ve keywordler de birer fonksiyon! • (def ustun {:name "Ustun" :surname "Ozgur"} • (ustun :name) ;; "Ustun" • (:surname ustun) ;; "Ozgur" • Aslinda IFn interfaceini implemente eden her şey bir fonksiyon

Slide 17

Slide 17 text

Syntax Karşılaştırması Java Clojure int i = 5; (def i 5) if (i == 0) { return y; } else { return z; } (if (zero? i) y 
 z) x * y * z (* x y z) foo(x, y, z) (foo x y z) foo.bar(x) (. foo bar x)

Slide 18

Slide 18 text

Sequence'lar • Normal Lisp'ler linked liste üzerine kuruludur. • Sequence, Clojure'un buna getirdiği bir abstraction, aslında Java'daki ISeq interface'i • (seq list) • (first list) • (rest list)

Slide 19

Slide 19 text

Zengin Sequence Fonksiyonları (drop 2 [1 2 3 4 5]) -> (3 4 5) (take 9 (cycle [1 2 3 4])) -> (1 2 3 4 1 2 3 4 1) (interleave [:a :b :c :d :e] [1 2 3 4 5]) -> (:a 1 :b 2 :c 3 :d 4 :e 5) (partition 3 [1 2 3 4 5 6 7 8 9]) -> ((1 2 3) (4 5 6) (7 8 9)) (map vector [:a :b :c :d :e] [1 2 3 4 5]) -> ([:a 1] [:b 2] [:c 3] [:d 4] [:e 5]) (apply str (interpose \, "asdf")) -> "a,s,d,f" (reduce + (range 100)) -> 4950

Slide 20

Slide 20 text

Java Entegrasyonu • (. Math PI) • (.. System getProperties (get "java.version")) • (new java.util.Date)

Slide 21

Slide 21 text

Swing örneği Demo

Slide 22

Slide 22 text

Fonksiyonel Programlama • 3 Temel Operasyon • Map: Dizinin eleman sayısı değişmez. Dönüştürme • Filter: Dizinin eleman sayısı azalır. Filtreleme • Reduce: Dizi tek sayıya indirgenir. Özet çıkarma

Slide 23

Slide 23 text

Neden fonksiyonel programlama? • State ne kadar az olursa o kadar iyi • Daha az hata • Daha hızlı geliştirme • Daha çok kod reuse

Slide 24

Slide 24 text

Neden popüler değildi? • Bilgisayarların yavaşlığı • von Neumann tarzı update in place geleneği • Persistent data structureların bilinmemesi

Slide 25

Slide 25 text

Persistent data structure ve veri paylaşımı

Slide 26

Slide 26 text

Varsayılan olarak Immutability • Değer değişimleri kontrollü olmalı • Bunun için 3 temel yapı • Atom • Ref • Agent

Slide 27

Slide 27 text

Atom • (def x (atom 0)) • (swap! x inc) • (reset! x 10) • (def x (atom {:ad "Ustun" :yas 29}) • (swap! x update-in :yas 30)

Slide 28

Slide 28 text

No content

Slide 29

Slide 29 text

Atomic Güncelleme

Slide 30

Slide 30 text

Java Interfaceleri ve Protokoller Demo

Slide 31

Slide 31 text

Daha birçok özellik Metadata
 Recursive functional looping Destructuring binding in let/fn/loop Python Haskell tarzı List comprehensions (for) Relational set algebra Multimethods
 Parallel computation Namespaces, zippers, XML

Slide 32

Slide 32 text

Clojure • Fonksiyonel • Immutable veri yapıları • Veri odaklı dinamik programlama • Kolay JVM entegrasyonu

Slide 33

Slide 33 text

Teşekkürler • Sorular? • Üstün Özgür • [email protected] • @ustunozgur