Clojure 함수
clojure
기본
함수 선언
(defn hello [name]
(println (str "Hello, " name)))
(hello "John") ; Hello, John
(defn hello
"name 에게 인사를 합니다." ; docstring
[name]
(println (str "Hello, " name)))
오버로딩
(defn hello
([name]
(println (str "Hello, " name)))
([name greeting]
(println (str greeting " " name))))
(hello "John") ; Hello, John
(hello "John" "Good morning") ; Good morning John
익명함수
; fn 을 사용한 익명함수
(fn [name]
(str "Hello, " name))
(fn [name greeting]
(str greeting " " name))
; # 를 사용한 축약표현
#(str "Hello, " %) ; 인자가 1개라면 % 로 인자를 표현
#(str %2 " " %1) ; 인자가 여러개라면 %1, %2, ... 로 인자 순서를 표현
predicate
predicate는 마지막에 ?
를 붙이는 것이 관례다.
(defn even?
"n이 짝수이면 true를 리턴합니다."
[n]
(= (rem n 2) 0)) ; rem 은 나머지를 계산하는 함수
(defn odd?
"n이 홀수이면 true를 리턴합니다."
[n]
(not= (rem n 2) 0))
함수를 생성하는 함수
partial
partial
을 사용하면 currying을 할 수 있다.
(defn add [a b] (+ a b))
(def add3 (partial add 3))
(add3 7) ; 10
comp
comp
를 사용하면 여러 함수를 하나로 합성한 파이프라인을 만들 수 있다.
합성된 함수는 comp
에 제공했던 함수를 오른쪽에서 왼쪽으로 실행한다.
(defn append-a [s] (str s "a"))
(defn append-b [s] (str s "b"))
(defn append-c [s] (str s "c"))
((comp append-c append-a append-b) "111") ; "111bac"
; 111 에 b 를 붙이고
; 111b 에 a 를 붙이고
; 111ba 에 c를 붙인다
참고문헌
- 클로저 시작하기 / 캐린 마이어 저 / 박상규, 김만명, 김영태 공역 / 인사이트(insight) / 초판 1쇄 발행 2016년 04월 01일 / 원제: Living Clojure