Notice
Recent Posts
Recent Comments
Link
«   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
Archives
Today
Total
관리 메뉴

psj2867

elixir의 특징 및 객체지향과의 비교 본문

언어/elixir

elixir의 특징 및 객체지향과의 비교

psj2867 2022. 10. 18. 19:32

책을 제외하고는 온라인에 괜찮은 한글로 된 기초 설명이 없어 정말 정말 간단하게 정리해보고자 합니다.

..사실 아직 잘 안 쓰이는 언어라 관심없어서지만

 

깊게 공부하는 것은 역시 책을 사거나 공식 문서 보는 것을 추천드립니다.

 

패턴 매칭

다른 언어와 연산자는 대부분 비슷합니다. 가장 차이점은 "=" 할당 연산자입니다.

elixir 에서 "=" 은 매치 연산자 입니다.

" left = right " 이런 구문이 있으면 elixir 는 left를 right 와 가능한 비슷하게 하려고 노력합니다.

예를들어

{ "abc" ,  a } = {"abc" ,  1 }

이런 문장은 "abc" 는 같으니까 넘어가고 a 에 가능한 비슷하게 1을 바인딩합니다. ( elixir 는 바인딩한다고 표현합니다. )

더 깊게 가면

data = { "abc", [1,2,3] , {:ok , %{ key1: 123} } }
{ "abc", [ h | t ] , { :ok, %{ key1: v1 }} } = data
# h = 1, t= [2,3], v1 = 123

이런식으로 중첩된 데이터 가져오는 것이 편해집니다.

객체지향에서는 저 데이터를 확인하고 가져오는데 정말 많은 코드가 필요합니다.

그리고 함수에 적용하면 패턴 매칭이라는 단어의 맞게 적절한 함수를 알아서 찾아줍니다.

예는 case 지만 비슷하게 함수에서도 동작하며 마치 객체지향의 오버로딩이 좀 더 똑똑해진 느낌입니다.

case data do
 {:ok, v1}-> v1
 {"abc", v1} -> v1
 _ -> "default"
end

그리고 이러한 패턴 매칭은 elixir 의 전부입니다.

정말 극단적으로 모든 것이 패턴 매칭으로 돌아갑니다.

정말 극단적으로 if 문도 패턴 매칭입니다.

def if(condition, do, else) do
    case condition do
    	:true -> do.()
        :false -> else.()
    end
end

실제 코드는 아니며 간단하게 작성했습니다.

 

꼬리 재귀

제대로된 함수형을 처음 접해서 꼬리 재귀를 처음 겪었습니다. 물론 객채지향에서 컴파일러가 반복문으로 바꾸는 식의 꼬리재귀는 경험했지만 정말 근본적인 꼬리 재귀를 보고 참신함에 놀라웠습니다.

기본적인 개념은 어차피 마지막에 함수를 부러올 거면 (예: return f1() ) 적당히 반환할 위치만 기억하면 스택이 필요없는 거 아닐까 라는 생각입니다.

f1-> f2 -> f3 를 호출 할 때 f2가 마지막에 f3 만 호출하면 f3 는 f1의 반환할 위치만 알고 바로 f1에 전달해 줄 수 있습니다.

 

그리고 이 꼬리재귀는 패턴 매칭 이외의 모든 것입니다.

for 문이 언어 특성상 잘 사용되지는 않지만 존재는 합니다. 다만 이것 또한 꼬리 재귀를 통하여 구현되어있습니다.

def for(condition, do) do
	if(condition == true) do
    	do.()
        for(condition, do)
    end
end
# 실제로는 매크로로 구현되어있으며 설명을 위한 코드입니다.

 

정말  함수형의, 함수형을 위한, 함수형에 의한 언어를 접하고 새로운 시각을 봤고 좋은 경험였던 것 같습니다.

...쓰는 사람이 거의 없지만

'언어 > elixir' 카테고리의 다른 글

elixir cheat sheet  (0) 2022.10.07
간단한 elixir 언어 후기  (0) 2022.10.06
Comments