수색…


함수 정의하기

함수는 다섯 가지 구성 요소로 정의됩니다.

헤더에는 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))


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow