재미있는 클로저의 이야기

13757 단어 Clojure

이게 뭐야?



오키나와에서 행해진 해커스 챔프 2016 의 간친회의 LT 대회에서 발표한 자료입니다.

Clojure란?


  • Lisp 방언 중 하나
  • 인터랙티브 개발 (REPL)
  • 함수형 프로그래밍
  • 병행 처리하기 쉽다
  • 다양한 실행 환경 (JVM, ClojureScript)


  • Lisp의 특징


    (str "カッコが多い言語です")
    
    ;; 関数をカッコの1番目に、2番目からあとにはその関数の引数をいれます
    (+ 1 2 3 4) ; => 10
    
    ;; マクロを使って新しい文法を自分で追加できます
    (defmacro unless [test then]
      (list 'if (list 'not test)
        then)))
    
    (if true "then" "else") ; => "then"
    (unless true "then" "else") ; => "else"
    
    

    인터랙티브 개발 (REPL)





    기본, 불변 데이터 (변수가 아님)


    ; シンボルにデータを束縛する
    (def my-name "arakaki yuji")
    my-name ; => "arakaki yuji"
    
    ; レキシカルスコープ内のみで一時的に束縛
     (let [my-name "yuji"]
       my-name) ; => "yuji"
    
    ; スコープ外には影響ない
    my-name; => "arakaki yuji" 
    
    ; 文字
    /a 
    
    ; 文字列
    "Hello World"
    
    ; list(Lispのベースとなるデータ型)
    (list 1 2 3) ; => (1 2 3)
    
    ; Vector(順番を持ったコレクション)
    ["a" 1 'hello \a]
    
    ; Map(キーと値を対応させたコレクション)
    {:name "arakaki yuji" :age 27}
    
    ; Set(値が一意になること保証したコレクション)
    
    ; シンボル
    (symbol "my-name") ; my-name
    
    ; 関数
    (fn [n] (+ n 5))
    ; => #object[user$eval19622$fn__19623 0x243a2394 "user$eval19622$fn__19623@243a2394"]
    
    

    함수가 1급 객체


    ; 関数定義
    (defn hello-world [name]
      (str "Hello World, " name))
    
    ; 関数が第1級オブジェクトなので引数で関数を返せる関数作れる
    (defn add-factory [number]
            (fn ([] number)
                ([n & more] (apply + (conj more n number)))))
    
    (def add-8 (add-factory 8)
    (def add-100 (add-factory 100))
    (add-8 2)
    ; => 10
    (add-100 30)
    ; => 130
    
    

    변경 가능한 데이터도 있습니다.



    기본 불변 데이터의 Clojure입니다만, 변경 가능한 데이터형도 있다.
    그들은 용도에 따라 구분할 수 있도록 여러 가지가 있습니다.

    변경 가능한 데이터 형식 유형


  • atom
  • ref
  • agent
  • ; atom 
    (atom x 1)
    x ; => #object[clojure.lang.Atom 0x757c7948 {:status :ready, :val 1}]
    ;; 値を参照するには@をつける
    @x ; => 1
    ;; 単独で値を変更したいデータの時に使う
    (reset! x 5)
    @x ; => 5
    
    ; ref
    (def y (ref 1))
    y ; => #object[clojure.lang.Ref 0x3fe68e45 {:status :ready, :val 1}]
    ;; 値を参照するには@をつける
    @y ; => 1
    ; refは複数の値を協調して変更したい場合に使う
    (def z (ref 5))
    (dosync 
      (ref-set y 10)
      (ref-set z 20))
    @y ; => 10
    @z ; => 20
    
    ; agent
    (def a (agent 1))
    a ; => #object[clojure.lang.Agent 0x307b6b7e {:status :ready, :val 1}]
    @a : => 1
    ; agentは非同期でデータを変更したい場合に使う
    (send a + 100)
    ; => #object[clojure.lang.Agent 0x307b6b7e {:status :ready, :val 1}]
    a
    ; => #object[clojure.lang.Agent 0x307b6b7e {:status :ready, :val 101}]
    
    

    병렬 처리를 하기 쉽다



    Clojure 자체가 동시 처리를 전제로 설계되었습니다.
  • 불변 데이터 형식
  • 함수 프로그래밍을 통해 부작용을 줄입니다
  • 병렬 처리를 지원하는 기능을 복수 준비


  • 동시 처리를 위한 기능



    아직 제대로 공부하고 있지 않기 때문에 이런 있어~정도・・
  • agent
  • thread
  • core.async
  • future


  • 다양한 실행 환경



  • Clojure(.clj)
  • JVM에서 실행되는
  • Java 라이브러리 사용 가능


  • ClojureScript(.cljs)
  • JavaScript로 컴파일 (AltJS)


  • 둘 다 코드 공유 가능(.cljc)
  • 프런트 엔드와 서버 측에서 로직을 공유할 수 있습니다
  • 각 운영 환경의 고유 기능은 공유 할 수 없으므로주의



  • 마지막으로



    Clojure 재미 있지만 아직 자신은 큰 응용 프로그램 작성한 적이 없기 때문에 앞으로 쓰고 싶습니다.

    만약 그 외에도 흥미있는 분이 있으면 함께 하자 ^^/

    좋은 웹페이지 즐겨찾기