함수 (Other Useful Functions and Macros)

함수 (Other Useful Functions and Macros)

Clojure에서 함수는 일급 시민이에요. fn으로 익명 함수를 만들고, #() 리더 매크로로 더 짧게 쓸 수 있어요. 여기서는 함수를 만드는 여러 도구와 출력·정규식 함수를 공식 Reference 기준으로 정리할게요.

출처: Clojure Reference - Other Useful Functions and Macros

본문

함수 만들기

다음 표는 함수를 만드는 주요 도구예요. 각 예시는 같은 결과 (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 — 객체를 하나 이상 공백으로 구분해 출력하고, 기본적으로 리더가 다시 읽을 수 있는 형태로 출력해요.
  • prnpr과 같지만 마지막에 줄바꿈을 붙여요.
  • print / println — 각각 pr / prn을 호출하되 *print-readably*nil로 바인딩해서, 문자열은 따옴표나 이스케이프 없이, 문자는 앞의 \ 없이 출력해요. 사람이 읽기 좋은 출력이에요.
  • *print-readably*가 참이면 메타데이터 출력 여부는 *print-meta*(기본 nil)로 조절돼요.

관련 함수 — *out* 출력: pr prn print println newline / 문자열로 출력: pr-str prn-str print-str println-str with-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-matcher re-find re-matches re-groups re-seq

더 알아보기