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를 통해 기호를 정의합니다.
기호
trainer
및 team
를 정의할 때 앞에 #'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를 사용하여 데이터를 구조화하는 방법을 배웁니다.
Reference
이 문제에 관하여(Clojure 배우기, 파트 VII), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/cazevedo/learning-clojure-part-vii-4i52텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)