Clojure 배우기, 파트 VII

우리는 함수와 몇 가지 기본 데이터 구조를 사용하는 방법을 배웠습니다. 이제 마침내 값과 함수를 정의할 때 좀 더 흥미롭게 만들기 시작할 것입니다.

기호



기호는 다른 종류의 값이며 값을 나타내는 이름입니다. def 함수를 사용하여 기호를 정의할 수 있습니다.

(def trainer "Green")
;; returns => #'user/trainer

(def team ["Pidgeotto" "Rattata" "Abra" "Charmander"])
;; returns => #'user/team


값을 평가할 때 예를 들어 반환으로 가져옵니다.

"Red"
;; returns => "Red"

8
;; returns => 8


그러나 기호는 참조하는 값을 평가합니다.

trainer
;; returns => "Green"

team
;; returns => ["Pidgeotto" "Rattata" "Abra" "Charmander"]


기호를 정의할 때 값에 직접 바인딩하지 않고 대신 값을 참조하는 데 사용되는 메커니즘인 Var를 통해 기호를 정의합니다.

기호 trainerteam를 정의할 때 앞에 #'user/가 있는 이름을 반환했음을 알 수 있습니다. 그것은 우리가 user 네임스페이스에 있는 var를 정의했다는 것입니다. 기호가 네임스페이스에 바인딩되어 있고 정규화된 이름으로 호출할 수 있기 때문입니다(동일한 네임스페이스에 있을 때는 그렇게 할 필요가 없습니다). 기호):

user/trainer
;; returns => "Green"

user/team
;; returns => ["Pidgeotto" "Rattata" "Abra" "Charmander"]


Is important that you have the attention that REPL always starts in the user namespace if you running these commands from a project maybe you have a different one declared at the beginning of the file. We can also redefine or define new namespaces as we see in the next parts.



허락하다



때때로 우리는 네임스페이스의 전역 값 대신 로컬로 사용되는 심볼을 정의하고 let 함수를 사용하여 이를 수행합니다. 이 함수는 내부에서만 사용할 수 있는 심볼 및 값으로 정렬된 요소 쌍 번호가 있는 벡터를 받습니다. let과 같은 블록(괄호).

(let [region "Kanto"
      place  "Route 1"]
  (str "You are in " place " of the region " region))
;; returns => "You are in Route 1 of the region Kanto"

region
;; returns => Syntax error compiling at (REPL:0:0).
;;         => Unable to resolve symbol: region in this context



함수를 정의할 때 let을 많이 사용합니다. 로컬 변수를 정의하면 각 값의 의미를 파악하는 데 도움이 되므로 코드의 가독성에 많은 도움이 됩니다.

기능



지금까지 본 것처럼 (operator arg arg args...) 구문이 있는 형식(표현식이라고도 함)을 사용하여 함수를 호출할 수 있지만 이제 함수를 정의하는 방법을 배울 차례입니다.

익명 함수



때때로 우리는 매개 변수로 전달해야 하는 함수가 필요하거나 간단히 사용할 수 있으며 함수의 가장 기본적인 용도입니다. 이름을 지정하지 않고 한 번만 사용되므로 이제 익명 함수가 됩니다. .

매개 변수와 함수 정의가 있는 벡터를 받는 fn 함수를 사용하여 익명 함수를 정의할 수 있습니다.

;; How define an anonymous function
(fn [x y] 
  (println "Making a vector...")
  [x y])
;; returns => #object[user$eval2048$fn__2049 0x6cce008e "user$eval2048$fn__2049@6cce008e"]

;; How to call an anonymous function
((fn [x y]
   (println "Making a vector...")
   [x y]) "The answer is " 42)
;; returns => Making a vector...
;;         => ["The answer is " 42]


Clojure에는 함수 반환이 무엇인지에 대한 지침이 없으며 대신 함수 본문의 마지막 값이 함수에서 반환됩니다(위 예제의 벡터).

Functions always return some value in Clojure (even if it's a nil value).



속기 익명 함수



괄호 앞에 #을 사용하여 익명 함수를 정의할 수 있습니다.

(#(str "Hello " "Clojure!"))
;; returns => "Hello Clojure!"


속기용으로 %를 매개변수로 사용할 수도 있습니다.

(#(str "Hello " %) "Camilo")
;; returns => "Hello Camilo"


함수가 여러 매개변수를 예상하는 경우 %를 %1, %2...로 지정할 수 있습니다.

(#(Math/pow %1 %2) 2 8)
;; returns => 256.0


명명 기능



def 함수를 사용하여 익명 함수(즉, 값)를 기호에 바인딩할 수 있으며 직관적으로 원하는 만큼 호출할 수 있습니다.

(def sum-numbers (fn [& args] (reduce + args)))
;; returns => #'user/sum-numbers

(sum-numbers 7 7 7)
;; returns => 21

(sum-numbers 4 9 3 6 2 8)
;; returns => 32

(user/sum-numbers 14 39 43 -60 21 83)
;; returns => 140


& is a special form in Clojure that is used to package the rest of the parameters in a vector. So in parameter definition [x y & z], this function will have 2 parameters x and y, and all other values passed after it will be in a vector called z. While in our case [& args] we packed all parameters in a vector called args.



defn으로 함수 정의



보다 읽기 쉬운 방식으로 함수를 정의하기 위한 구문 설탕이 defn입니다. (+ def fn) => defn 로 생각할 수 있습니다. defn은 기호, 함수 매개변수의 벡터 및 함수 본문을 매개변수로 가져옵니다.

;; Function definition with defn
(defn name
  "Optional docstring that describes what this function does." 
  [params]
  ...params)

;; example
 (defn sum-evens [numbers]
   (->> numbers
        (filter even?)
        (reduce +)))
;; returns => #'user/sum-evens


여러 인수가 있는 함수



Arity is the number of arguments or operands taken by a function.



함수가 여러 매개변수 가능성을 가질 수 있음을 지정할 수 있습니다. 이를 위해 매개변수 벡터를 전달하는 대신 벡터와 정의가 있는 쌍을 수신하는 형식으로 각 정의를 래핑할 것입니다. 이 작업을 위해 각 정의는 달라야 합니다. 다른 사람에게서.

(defn make-point
  ([x] [x 0])
  ([x y] [x y]))

(make-point 5)
;; returns => [5 0]

(make-point 5 4)
;; returns => [5 4]


곧 봐요!



이제 우리는 재미를 느끼기 시작했습니다. 함수를 사용하여 많은 유용한 것을 만들 수 있습니다. 여러분이 직접 해보도록 도전하겠습니다. 숫자 순서 뒤집기 또는 fizzbuzz 연습과 같은 작업을 수행하는 간단한 함수를 구축하기에 좋은 시기입니다.

다음 장에서는 계속해서 Clojure 컬렉션을 탐색하고 Hash-Maps를 사용하여 데이터를 구조화하는 방법을 배웁니다.

좋은 웹페이지 즐겨찾기