재미있는 클로저의 이야기
13757 단어 Clojure
이게 뭐야?
오키나와에서 행해진 해커스 챔프 2016 의 간친회의 LT 대회에서 발표한 자료입니다.
Clojure란?
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입니다만, 변경 가능한 데이터형도 있다.
그들은 용도에 따라 구분할 수 있도록 여러 가지가 있습니다.
변경 가능한 데이터 형식 유형
(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"
기본, 불변 데이터 (변수가 아님)
; シンボルにデータを束縛する
(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입니다만, 변경 가능한 데이터형도 있다.
그들은 용도에 따라 구분할 수 있도록 여러 가지가 있습니다.
변경 가능한 데이터 형식 유형
; シンボルにデータを束縛する
(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"]
; 関数定義
(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
(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 자체가 동시 처리를 전제로 설계되었습니다.
동시 처리를 위한 기능
아직 제대로 공부하고 있지 않기 때문에 이런 있어~정도・・
다양한 실행 환경
Clojure(.clj)
ClojureScript(.cljs)
둘 다 코드 공유 가능(.cljc)
마지막으로
Clojure 재미 있지만 아직 자신은 큰 응용 프로그램 작성한 적이 없기 때문에 앞으로 쓰고 싶습니다.
만약 그 외에도 흥미있는 분이 있으면 함께 하자 ^^/
Reference
이 문제에 관하여(재미있는 클로저의 이야기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/arakaji/items/41ae4f536cafe57b5842
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(재미있는 클로저의 이야기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/arakaji/items/41ae4f536cafe57b5842텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)