티스토리 뷰

Clojure

[Clojure] 클로저에서 Vector 분해

박중수 2015. 11. 25. 17:19


List, Map, Vector같은 자료구조에서 특정한 값을 골라 바인딩하는 방법을 알아보겠다.


먼저 테스트에 사용될 중첩된 Vector를 정의한다.

(def vec [[0 1] [2 3]])


Vector를 받는 함수를 정의하면서 매개변수단에서 두 번째 벡터의 첫 번째 값인 2를 추출하여 바인딩 해보겠다.

(defn get-third [[_ [item _]] (str item " get complete"))


대강 봐서는 무슨소리인지 눈에 들어오지도 않을것이다.


해석해보자면 [[_ [item _]] 에서 굵게 표시된 부분은 함수의 파라미터란 뜻이다. (이전 글에서 언급한 적이 있다.)

또한 [[_ [item _]] 에서 굵게 표시된 안쪽 대괄호는 [[0 1] [2 3]] 에서 굵게 표시된 바깥 대괄호를 뜻한다.


그리고 [[_ [item _]] 에서 빨간색으로 표시된 첫 번째 언더바(_)는 [[0 1] [2 3]] 굵게 표시된 첫 번째 요소 벡터를 의미한다.


[[_ [item _]] 요소는 [[0 1] [2 3]] 이고,   [[_ [item _]]은 [[0 1] [2 3]],     [[_ [item __]]은 [[0 1] [2 3]]  을 의미한다.


대강 감이 왔을 것 같은데 함수의 파라미터를 표시하는 바깥 대괄호를 제외한 [[_ [item _]] 의 패턴은 vec변수인 벡터 [[0 1] [2 3]] 의 패턴과 일치한다. 


언더바(_)는 제외할 요소를 지정하는 것이고, item은 그 순서에 해당하는 요소를 item이라는 변수에 담는 것이다.


즉 [[0 1] [2 3]] 에서 2를 item이라는 변수에 담았으니 바인딩 부분에서 (str item " get complete") 을 실행하면 "2 get complete" 가 출력될 것이다.


다른 예로 매개변수에 [[_ [_ item]] 을 지정하면 "3 get complete" 가 출력될 것이다.



분해는 let 함수를 통해서도 할 수 있는데 let 함수의 뼈대는 아래와 같다

(let [매개변수 분해하려는Collection] (바인딩))


위와 같은 방법으로 첫 번째 벡터의 두 번째 요소인 1을 추출해보겠다.

(let [[[_ item] _] line] (str item " get complete"))


대부분 사용법은 함수와 같지만 살짝 다른점은 (let [[[_ item] _] line] (str item " get complete")) 과 같이 분해하려는 Collection이 담긴 변수를 넘겨야 한다는 점이다.


위의 결과로는 첫 번째 벡터의 두 번째 요소인 1이 추출되었으므로 "1 get complete"가 출력된다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함