함수 (Other Useful Functions and Macros)
함수 (Other Useful Functions and Macros)
Clojure에서 함수는 일급 시민이에요. fn으로 익명 함수를 만들고, #() 리더 매크로로 더 짧게 쓸 수 있어요. 여기서는 함수를 만드는 여러 도구와 출력·정규식 함수를 공식 Reference 기준으로 정리할게요.
본문
함수 만들기
다음 표는 함수를 만드는 주요 도구예요. 각 예시는 같은 결과 (3 4 5) 같은 값을 만들지만 방식이 조금씩 달라요.
| 함수 | 예시식 | 반환값 |
|---|---|---|
fn |
(map (fn [x] (+ 2 x)) [1 2 3]) |
(3 4 5) |
#() 리더 매크로 |
(map #(+ 2 %) [1 2 3]) |
(3 4 5) |
partial |
(map (partial + 2) [1 2 3]) |
(3 4 5) |
comp |
(map (comp - *) [2 4 6] [1 2 3]) |
(-2 -8 -18) |
complement |
(map (complement zero?) [3 2 1 0]) |
(true true true false) |
constantly |
(map (constantly 9) [1 2 3]) |
(9 9 9) |
fn— 익명 함수를 만들 때 쓰는 특수 형식이에요.#()리더 매크로 — 익명 함수를 더 간결하게 쓸 때 사용해요.%는 첫 번째 인자,%2는 두 번째 인자예요.partial— 앞쪽 인자를 부분 적용해 새 함수를 만들어요.(partial + 2)는 "2를 더하는 함수"가 돼요.comp— 여러 함수를 오른쪽에서 왼쪽으로 합성해요.(comp - *)는 곱한 다음 부호를 바꿔요.complement— 술어 함수의 결과를 뒤집어요.zero?의 반대인 "0이 아닌가" 같은 함수가 돼요.constantly— 어떤 입력이 와도 항상 같은 값을 돌려주는 함수를 만들어요.
출력하기
*out*의 현재 값인 출력 스트림에 객체를 출력하는 함수가 여러 개 준비돼 있어요. -str이 붙은 버전은 *out*을 StringWriter에 바인딩해서 거기에 출력한 뒤 그 결과 문자열을 돌려줘요.
pr— 객체를 하나 이상 공백으로 구분해 출력하고, 기본적으로 리더가 다시 읽을 수 있는 형태로 출력해요.prn—pr과 같지만 마지막에 줄바꿈을 붙여요.print/println— 각각pr/prn을 호출하되*print-readably*를nil로 바인딩해서, 문자열은 따옴표나 이스케이프 없이, 문자는 앞의\없이 출력해요. 사람이 읽기 좋은 출력이에요.*print-readably*가 참이면 메타데이터 출력 여부는*print-meta*(기본nil)로 조절돼요.
관련 함수 —
*out*출력:prprnprintlnnewline/ 문자열로 출력:pr-strprn-strprint-strprintln-strwith-out-str
정규식 지원
정규식 패턴은 리더 매크로 #"pattern"으로 컴파일 타임에, 또는 re-pattern으로 런타임에 만들 수 있어요. 두 형태 모두 java.util.regex.Pattern 객체를 만들어요.
user=> (re-seq #"[0-9]+" "abs123def345ghi567")
("123" "345" "567")
user=> (re-find #"([-+]?[0-9]+)/([0-9]+)" "22/7")
["22/7" "22" "7"]
user=> (let [[a b c] (re-matches #"([-+]?[0-9]+)/([0-9]+)" "22/7")]
[a b c])
["22/7" "22" "7"]
user=> (re-seq #"(?i)[fq].." "foo bar BAZ QUX quux")
("foo" "QUX" "quu")
관련 함수 —
re-matcherre-findre-matchesre-groupsre-seq
더 알아보기
- Clojure Reference - Data Structures — 함수가 다루는 불변 데이터 구조
- Clojure Reference - Sequences — 함수의 인자가 되는 시퀀스
- Clojure Guides - Higher Order Functions — 함수를 값처럼 다루는 고차 함수