불로장생약 엿보기 - 1부

6449 단어

불로장생이 뭐예요? 왜 제가 배우고 싶어요?


아직 모르신다면, Elixir은 동적 함수식 프로그래밍 언어로 확장 가능하고 유지보수가 가능한 응용 프로그램을 구축하는 데 목적을 두고 있습니다.이것은 Erlang VM 위에 구축되어 있으며 Erlang 바이트 코드로 컴파일됩니다.Stackoverflow survey은 Elixir가 최근 가장 인기 있는 프로그래밍 언어 중 하나가 되어 더욱 흥분된다고 밝혔다.
함수식 프로그래밍은 내가 정의적으로 알고 있는 것으로, 그것을 사용하는 생각은 실제로 매우 재미있게 들린다!나는 확실히 내가 한 무더기의 물건을 잊어야만 불로장생의 약을 배울 수 있다고 들었지만, 다른 하나는 그것을 바라보는 방식이 새로운 사고방식을 배우는 것이다.

대화형 셸


일단 elixir가 installed이면 Elixir's interactive shell을 사용할 수 있습니다. 터미널에서 iex을 입력할 수 있습니다.이곳에서 당신은 불로장생약 표현식을 사용해 결과를 얻을 수 있습니다.IEX는 h()을 입력하여 액세스할 수 있는 지원 그룹도 제공합니다.
이제 불로장생약의 특성을 살펴보자.

패턴 일치와 불변성


그래서 우리가 =을 사용할 때 내 말은 변수에 값을 부여하는 것이다.하지만 지금 우리가 가야 할 곳은 다르다는 뜻이다.연산자는 pattern matching이라는 조작을 실행하기 때문에 match 연산자라고 부른다.여기에서 이름과 같이 두 요소를 비교하여 일치하는지 확인하고, 일치하면 오른쪽 값이 왼쪽 요소로 귀속됩니다.
#In OOP, this assigns value 10 to the variable a
a = 10 

#In Elixir, value 10 is bound to a
iex> a = 10

그래, 잠깐만.지금 내가 이 표현식을 반전시키고 놀면?
#In OOP, we get a syntax error
10 = a

#In Elixir, this is valid since both the sides match
iex> 10 = a
10

#This will throw a match error
iex> 11 = a
** (MatchError) no match of right hand side value: 10

#Here, a is rebound with 11
iex> a = 11
더 복잡한 원소에서 이걸 시험해 봅시다.
#Here, a = 1, b = 2, c = 3
iex> [a, b, c] = [1, 2, 3] 

#Here, head = 1 and tail = [2, 3]
iex> [head | tail] = [1, 2, 3]
위의 예에서 우리는 수조를 서로 다른 원소로 분해할 수 있다.이것은 destructuring이라고 불린다.
이제 우리는 이 점을 분명히 했다. immutability이 무엇인지 찾아내 보자.Elixir에서 모든 값은 immutable입니다.변수가 어떤 값을 인용하면 버려지거나 쓰레기가 회수될 때까지 이 값을 인용합니다.이 데이터를 변환하는 모든 함수는 새 복사본으로 되돌아옵니다.

Eeesh, 네, 너무 많아요.우리 그것을 분해합시다.다음 코드 세그먼트를 고려하십시오.
iex> list1 = [3, 2, 1]

iex> list2 = [4 | list1]
현재, 우리는 통상적으로 list2 = [4, 3, 2, 1]을 기대하는데, 그 중에서list1ie[3, 2, 1]의 값은 4와 함께 목록에 복사된다.그러나list1의 값은 영원히 변하지 않을 것이라는 것을 알고 있기 때문에list2는 현재 새로운 목록입니다. 머리는 4, 끝은list1입니다.Elixir의 목록에 대해 알아야 할 또 다른 것은 체인 테이블로 이루어진다는 것이다.이것은 접근 목록의 길이가 선형 시간 (O (n) 으로 실행되는 작업이라는 것을 의미한다.따라서 선행은 추종보다 빨라진다.
이제 이것은 더욱 의미가 있다. 우리는 함수를 계속 쓸 수 있다.

기능 및 모듈


Elixir는 함수를 기본 유형으로 만드는 함수 프로그래밍 언어입니다.프로그램에 구조를 가져다 줄 클래스가 없습니다. functions을 사용해서 modules으로 구성해야 합니다.
모듈은 기본적으로 우리가 정의한 물건에 명칭 공간을 제공한다.우리는 또한 하나의 모듈 안에 여러 개의 함수를 가지고 있으며, 모듈 이름을 접두사로 사용하여 모듈 밖에서 이 함수를 인용할 수 있다.
다음 몇 가지를 고려해 봅시다.
**Operations.exs**

defmodule Operations do
  def sum(a, b) do
    a + b
  end
  def sum(a, b, c) do
    a + b + c
  end
end
IO.puts Operations.sum(1, 2, 3)
IO.puts Operations.sum(3, 1)

# We run the program using the command
elixir math.exs
6
4
위에서 보듯이 우리는 mutli-clause functions을 사용할 수 있습니다. 왜냐하면 같은 함수에 전달된 매개 변수에 따라 같은 함수에 여러 가지 정의가 있기 때문입니다.기호 function_name/number_of_arguments(arity)은 함수를 나타내는 데 사용됩니다.상술한 예시에서elixir에 대해sum/2와sum/3은 완전히 독립된 함수이다.
이것은 확실히 우리가 전달하는 매개 변수의 수량에 따라 함수를 호출할 수 있지만, 매개 변수의 유형에 따라 구분하기 위해 무엇을 해야 하는지 보여 준다.

보호 조항


이것은 우리가 함수 정의에 하나 이상의 when 키워드를 추가한 술어입니다.Elixir는 현재 매개 변수의 수량과 일치하는 when 술어를 계산합니다. 최소한 하나의 술어가true일 때만 이 함수를 실행합니다.
defmodule Guard do
  def what_is(x) when is_number(x) do
  IO.puts "#{x} is a number"
  end
  def what_is(x) when is_list(x) do
    IO.puts "#{inspect(x)} is a list"
  end”
end

Guard.what_is(100)
100 is a number

차례로 돌아가다


아래의 코드 부분을 봅시다.
for(i=0; i<5; i++) {
    console.log("This violates immutability")
}
소식에서 보듯이 이것은 불변성의 개념을 위반한 것이다. 왜냐하면 우리는 변이 변수 i을 시도했기 때문이다.이 교체는 recursion을 사용하여 Elixir에서 실현할 수 있으며, 우리는 함수를 작성할 때 그것을 이해할 수 있다.
앞의 for 순환을 되돌아보고 함수와 보호 자구를 어떻게 작성하는지 이해하면 우리는 이런 방식으로 유사한 코드를 작성할 수 있다.
defmodule Recursion do
  def print_multiple_times(msg, n) when n <= 1 do
    IO.puts msg
  end

  def print_multiple_times(msg, n) do
    IO.puts msg
    print_multiple_times(msg, n - 1)
  end
end

Recursion.print_multiple_times("This Works!", 3)
# This Works!
# This Works!
# This Works!
여기서 함수를 처음 호출할 때 보호자 n<=1 (n=3 때문에) 을 통과하지 않으면 두 번째 함수를 실행합니다.두 번째 함수는 n의 값을 점차 줄인 후에 자신과 첫 번째 함수를 순서대로 호출합니다. 이것이 바로 반복 처리를 사용하는 방식입니다.

파이프 작업자 |>


어떤 경우, 우리는 특정한 함수의 출력을 다른 함수의 입력으로 필요로 하는데, 우리는 이렇게 쓴다.
output_1 = function_1(input_1)
output_2 = function_2(output_1)
파이프 조작부호를 사용하면 우리는 그것을 다시 쓸 수 있기 때문에 첫 번째 함수의 결과를 두 번째 함수의 입력으로 삼을 수 있다.
output2 = input_1 |> function_1 |> function_2
함수와 모듈에 대한 더 많은 내용이 있습니다. here을 읽을 수 있습니다.

지금까지 나는 이것이 매우 재미있다고 말해야 했다. 나는 지체없이 깊이 파고들고 싶었다.섹션 2를 계속 살펴보십시오.")
표지 사진 작가 Marcus Wallis

좋은 웹페이지 즐겨찾기