수색…
함수 정의하기
함수는 다섯 가지 구성 요소로 정의됩니다.
헤더에는 defn
키워드, 함수의 이름이 포함됩니다.
(defn welcome ....)
함수가 무엇을하는지 설명하고 문서화하는 선택적인 Docstring.
(defn welcome
"Return a welcome message to the world"
...)
매개 변수는 대괄호 안에 나열됩니다.
(defn welcome
"Return a welcome message"
[name]
...)
함수가 수행하는 절차를 설명하는 본문입니다.
(defn welcome
"Return a welcome message"
[name]
(str "Hello, " name "!"))
그것을 부르는 것 :
=> (welcome "World")
"Hello, World!"
매개 변수와 아티
Clojure 함수는 0 개 이상의 매개 변수로 정의 할 수 있습니다.
(defn welcome
"Without parameters"
[]
"Hello!")
(defn square
"Take one parameter"
[x]
(* x x))
(defn multiplier
"Two parameters"
[x y]
(* x y))
아티
함수가 취하는 인수의 갯수. 함수는 arity 오버로드를 지원합니다. 즉, Clojure의 함수는 둘 이상의 "인수"집합을 허용합니다.
(defn sum-args
;; 3 arguments
([x y z]
(+ x y z))
;; 2 arguments
([x y]
(+ x y))
;; 1 argument
([x]
(+ x 1)))
그러한 일들은 똑같은 일을 할 필요가 없다. 각각의 일은 무관 한 일을 할 수있다.
(defn do-something
;; 2 arguments
([first second]
(str first " " second))
;; 1 argument
([x]
(* x x x)))
가변 인자 함수 정의하기
Clojure 함수는 인수 목록에 기호 & 를 사용하여 임의의 수의 인수를 취하도록 정의 할 수 있습니다. 나머지 모든 인수는 시퀀스로 수집됩니다.
(defn sum [& args]
(apply + args))
(defn sum-and-multiply [x & args]
(* x (apply + args)))
부름:
=> (sum 1 11 23 42)
77
=> (sum-and-multiply 2 1 2 3) ;; 2*(1+2+3)
12
익명 함수 정의하기
익명 함수를 정의하는 두 가지 방법이 있습니다 : 전체 구문과 속기.
완전한 익명 함수 구문
(fn [x y] (+ x y))
이 표현식은 함수로 평가됩니다. defn
( &
, 인수 소멸 등)으로 정의 된 함수에서 사용할 수있는 모든 구문은 fn
형식으로도 수행 할 수 있습니다. defn
은 실제로 매크로 (def (fn ...))
입니다.
속기 익명 함수 구문
#(+ %1 %2)
이것은 속기 표기법입니다. 속기 표기법을 사용하면 명시 적으로 인수를 명명 할 필요가 없습니다. 전달 된 순서에 따라 %1
, %2
, %3
등의 이름이 할당됩니다. 함수에 하나의 인수 만 있으면 그 인수를 %
로 부릅니다.
각각의 사용시기
속기 표기법에는 몇 가지 제한이 있습니다. 인수를 파기 할 수는 없으며 속기있는 익명 함수를 중첩 할 수 없습니다. 다음 코드는 오류를 발생시킵니다.
(def f #(map #(+ %1 2) %1))
지원되는 구문
당신 은 단축형 익명 함수와 함께 varargs를 사용할 수 있습니다 . 이것은 완전히 합법적입니다.
#(every? even? %&)
가변 개수의 인수를 사용하고 각 인수가 짝수 일 경우 true를 반환합니다.
(#(every? even? %&) 2 4 6 8)
;; true
(#(every? even? %&) 1 2 4 6)
;; false
명백한 모순에도 불구하고 다음 예와 같이 이름을 포함하여 명명 된 익명 함수를 작성할 수 있습니다. 이것은 함수 자체를 호출해야하지만 스택 추적에서도 필요할 때 특히 유용합니다.
(fn addition [& addends] (apply + addends))