Clojure - Liszp Rapszódia

Miért Clojure?

A kifejezésmód
gazdagsága

logikai programozás

gráf programozás

platformfüggetlen

izomorfikus

pofon egyszerű

programot író program

hatalom

praktikus & addiktív 

másmilyen problémák

saját nyelv

saját komponensek

még több saját dolog

újrafelhasználható

kicsi core

koherens design

kiváló kezdőknek, tökéletes mestereknek

a programozás élmény

a programozás egy interaktív alkotási folyamat

Clojure, my friend

E
D
N

nil ; Null

; Boolean
true
false

; String
"hungarian breakfast"

; Characters
\g \r \a \c \e

; Keywords speciális stringek
:eggs
:hungarian/breakfast

; Symbols reprezentálnak valamit 
fork
kitchen/fork  ; not the same as fork
github/fork   ; you can't eat with this

; Integers and floats
42
3.14159
; Lists értékek szekvenciái
(:bun :beef-patty 9 "yum!")

; Vectors elérés, olvashatóság
[:gelato 1 2 -2]

; Maps asszociatív adatszerkezet, kulcs-érték párokkal
{:eggs                   2
 :lemon-juice            3.5
 ["strange" {nil true}]  :what/happened}

; Sets egyedi értékeket tartalmazó gyűjtemény
#{:a :b 88 "huat"}
code 
is
data
(def val2 (operation value))

"Everything is a function/macro call"

(def operation (fn [arg] (+ arg arg)))
(def value 3)
(defn operation [arg] (+ arg arg))
(defn operation2 [op arg] (op arg arg))
(operation2 * val2) => 36

macro < function < data

"Keep it simple, stupid"

(let [value      3
      val2       (+ value value)
      operation  (fn [op a] (op a a))]
  (operation * val2))
((fn [op a] (op a a)) * (+ 3 3))
(* (+ 3 3) (+ 3 3))
           public void greetingsFromSanta(int n) {
                for (int i = 0; i < n; ++i) {
                    System.out.print("Ho! ");
                }
            }
           (defn santa-says [n]
                (when (> n 0)
                    (print "Ho! ")                
                    (santa-say (dec n))))
(defn santa-says [n] (dotimes [i n] (print "Ho! "))) 

Immutability in practice

(defn santa-says [n] (apply print (repeat n "Ho!")))

TRIVIÁLIS

egyáltalán ne írjunk mutábilis részeket

composable algorithmic transformations

(filter odd?)       ; a transducer that filters odd
(map inc)           ; a mapping transducer for incrementing
(take 3)            ; will take the first 3 values


(take 3
      (map inc
           (filter odd?
                   (range 9007199254740991))))
(->> 9007199254740991 ;max 64-bit float. point in js: 2^53-1
     range          ; (0 1 2 3 4 5 6 7 8 9 ...
     (filter odd?)  ; (1 3 5 7 9 ...
     (map inc)      ; (2 4 6 8 10 ...
     (take 3))      ; (2 4 6)

"Elapsed time: 0.020000 msecs"

tips & tricks

(defn cond-test [n]
  (cond
    (odd? n)        "that's odd.."
    (= n 1)         "n is 1"
    (= n 2)         (cond-test 4)
    (< 3 n 10)      "n is over 3 and under 10 or n is 2"
    :else           "n is other")

(def hex-digit (set "0123456789"))

(defn hex-str? [s] (every? hex-digit? (seq s)))

(def :hash (and hex-str? (fn [x] (= (count x) 78))))

(valid? :hash "23179372") => false

(valid? :hash "nope93721907914920047210715459933122004671648400678953445710500236944435987060")
=> false

(valid? :hash "231793721907914920047210715459933122004671648400678953445710500236944435987060")
=> true
(generate (gen :hash))
=> "310584715385467847758653938894742415543975445356609397864862925839413265904779"

Pro tip: függvényeket is lehet specelni

interoperability

(java.util.Date.)       ; java

(js/Date)               ; javascript

(new DateTime.Date.)    ; .NET

 

(def code'ADD 0x4400)   ;armv6m
(def mask'ADD 0xff00)
#_"ADD <Rdn>,<Rm>"

HATALOM

ReadEvalPrintLoop
(defn repl []
   (-> read eval print)
   (repl))
(defn repl
  "Your best friend"
  {:added "0.1"}
  []
  (let [new-line (fn [] (print "> ") (read-line))]
    (loop [input (new-line)]
      (-> input eval println)
      (recur (new-line)))))

Oké, de ki használja?

köszi,
raz

clojure.hu
clojure.network

HACKERSPACE SZEGED IRC BRIDGE

raz

zgen.hu