2절 모듈과 함수 (상)

5238 단어

모듈


모듈은erlang의 기본 코드 단원입니다.모듈은 확장자 에 저장됩니다.erl의 파일에서, 모듈의 코드를 실행하려면 먼저 컴파일해야 합니다.컴파일된 모듈은.beam을 확장자로 합니다.
Geometry를 만듭니다.erl 파일
1 -module (geometry).
2 -export ([area/1]).
3 
4 area({rectangle,Width,Height})    ->    Width * Height;
5 area({square, Side})    ->    Side * Side.

그리고 셸에서 이 모듈을 컴파일해서 실행합니다.
  1> c(geometry).  {ok,geometry}  2> geometry:area({rectangle, 10, 5}).  50  3> geometry:area({square,4}).  16
첫 번째 줄 c (파일 이름) 의 역할은 파일 안의 코드를 컴파일하는 것입니다. 실행에 성공하면 {ok, xxxxxx}와 같은 결과를 되돌려줍니다.동시에 하나를 생성합니다.beam의 목표 코드 모듈입니다.
두 번째 줄에서 우리는 파일 이름: 방법 (매개 변수) 을 통해 모듈의 함수를 호출합니다.(함수 이름에 모듈 이름을 붙여야만 호출하고 싶은 함수가 무엇인지 정확하게 표시할 수 있음을 주의하십시오.)
다음 단계에서, 우리는 모듈에 간단한 테스트 모듈을 추가하려고 한다.이전의 모듈을 Geometry 라고 명명하다test.erl
 1 -module (geometry_test).
 2 -export ([test/0,area/1]).
 3 
 4 test()    ->
 5     12 = area({rectangle, 3, 4}),
 6     144 = area({square, 12}),
 7     tests_worked.
 8 
 9 area({rectangle,Width,Height})    ->    Width * Height;
10 area({square, Side})    ->    Side * Side.

그리고 셸에서 모듈을 컴파일하고 테스트를 받으면worked라는 글자는 테스트가 통과되었음을 나타냅니다.
  1> c(geometry_test).  {ok,geometry_test}  2> geometry_test:text().  ** exception error: undefined function geometry_test:text/0  3> geometry_test:test().  tests_worked
셸에 함수 이름을 잘못 입력하면 오류 알림이 발생합니다.
이전 함수에 area ({circle, Radius}) 를 추가합니다. -> 3.14159 * Radius * Radius.추가할 자구는 순서가 중요하지 않다.자구를 어떻게 배열하든지 간에 프로그램은 모두 하나의 뜻이다. 왜냐하면 자구 안의 각 모델은 서로 배척되기 때문이다.이것은 우리로 하여금 확장 프로그램을 작성하는 것을 매우 간단하게 한다.
마지막으로 우리 모듈을 다시 한 번 보면 쉼표(,)분호(;)가 있는 것을 발견할 수 있다.마침표(.)이런 부호.
쉼표(,) 구분 함수 호출, 데이터 구조와 모드의 매개 변수.
세미콜론(;)분리 자구.
마침표(.)분리 함수 전체.

fun: 기본적인 추상적 단원


erlang은 함수식 프로그래밍 언어의 일종이다.그 밖에 함수식 프로그래밍 언어는 함수가 다른 함수의 매개 변수로 사용할 수도 있고 함수를 되돌릴 수도 있음을 나타낸다.다른 함수를 조작하는 함수는 고급 함수라고 하고,erlang에서 함수를 대표하는 데이터 형식은fun.라고 한다.
  1.목록의 모든 요소에 대해 같은 조작을 실행합니다.
  2.자신의 제어 추상을 만듭니다.(erlang에 for 순환이 없음)
  3.해석 코드, 해석 조합기, 또는 타성 값 구하기 등 사물을 다시 입력할 수 있습니다.
  1> Double = fun(X) -> 2*X end.  #Fun  2> Double(2).  4
위에는 셸에서fun을 정의하는 방법이 있습니다.
다음은 두 개의 매개 변수를 정의하는 것이 어떤 것인지 봅시다.
  3> Hypot = fun(X, Y)    ->      math:sqrt(X*X + Y*Y) end.  #Fun  4> Hypot(3,4).  5.0
다음에 우리는fun을 매개 변수로 한다.표준 라이브러리에서lists 모듈은fun을 매개 변수로 하는 함수를 내보냅니다.그들 중 가장 유용한 것은lists:map(F,L)이다.이 함수는 목록 L의 각 요소에 fun F를 적용하여 생성된 목록을 되돌려줍니다.
  5> L = [1,2,3,4].  [1,2,3,4]  6> lists:map(fun(X) -> 2*X end, L).  [2,4,6,8]
또 다른 유용한 함수는lists:filter(P,L)로 L에 있는 모든 조건에 맞는 요소를 포함하는 새로운 목록을 되돌려줍니다. (조건은 요소 E에 대해 P (E) 는true)
  Even = fun(X) -> (X rem 2) =:= 0 end.
함수 Even(X)을 정의하고 X가 짝수이면 true를 반환합니다.rem회계는 2를 나눈 후의 나머지를 계산합니다. = = 같은지 확인하는 데 사용됩니다.
그리고 맵과 필터를 매개 변수로 사용합니다.
  10> lists:map(Even, [1,2,3,4,5,6,8]).  [false,true,false,true,false,true,true]  11> lists:filter(Even, [1,2,3,4,5,6,8]).  [2,4,6,8]
함수는fun을 매개 변수로 사용할 수 있을 뿐만 아니라fun도 되돌려줄 수 있다.
  12> Fruit = [apple,pear,orange].  [apple,pear,orange]  13> MakeTest = fun(L) -> (fun(X) -> lists:member(X, L) end) end.  #Fun  14> IsFruit = MakeTest(Fruit).  #Fun  15> IsFruit(pear).  true  16> IsFruit(apple).  true  17> IsFruit(dog).  false
괄호 안의 물건이 되돌아오는 값이라는 것을 기억해라.
다음에 우리는 사용자 정의 제어 추상을 실현하지만, 지금까지erlang에서if문장, switch문장, for문장 또는while문장을 보지 못했다. 그리고 이 모든 것은 패턴 일치와 고급 함수로 작성된 것이다.우리 스스로 for 구조 모듈을 실현한다.
1 -module (lib_misc).
2 -export ([for/3]).
3 
4 for(Max, Max, F)    ->    [F(Max)];
5 for(I, Max, F)        ->    [F(I) | for(I+1, Max, F)].

그리고 셸에서 이 모듈을 실행합니다
  1> lib_misc:for(1,10,fun(I) -> I end).  [1,2,3,4,5,6,7,8,9,10]  2> lib_misc:for(1,10,fun(I) -> I*I end).  [1,4,9,16,25,36,49,64,81,100]
전재 대상:https://www.cnblogs.com/malkin/p/4907327.html

좋은 웹페이지 즐겨찾기