Y 분 에 에 랑 배우 기.

% 百分比符号标明注释的开始。

%% 两个符号通常用于注释函数。

%%% 三个符号通常用于注释模块。

Erlang 에 서 는 세 가지 문장 부 호 를 사용 합 니 다.
  • 쉼표 , 분리 함수 호출 중의 매개 변수, 데이터 구축 과 모델.
  • 마침표 . (뒷 굽 빈 칸) 분리 함수 와 셸 의 표현 식.
  • 분점 ; 구분자.다음 환경 에서 사용 하 는 문장: 함수 정의 와 case, if, try..catch, receive 표현 식.

  • 1. 변수 와 패턴 일치
    Num = 42.  % 变量必须以大写字母开头。
    

    Erlang 의 변 수 는 한 번 만 할당 할 수 있 습 니 다.변수 에 다른 값 을 부여 하면 오류 가 발생 할 수 있 습 니 다:
    Num = 43. % ** exception error: no match of right hand side value 43
    

    대부분의 언어 = 는 할당 문 구 를 나타 내 고 Erlang 에 서 는 패턴 이 일치 하 는 것 을 나타 낸다.Lhs = Rhs 사실은 오른쪽 (Rhs) 을 연산 하여 결 과 를 왼쪽 모드 와 일치 시 키 는 것 을 의미한다.
    Num = 7 * 6.
    

    부동 소수점
    Pi = 3.14159.
    

    Atoms 는 비 숫자의 상수 를 나타 내 는 데 쓰 인 다.Atom 은 알파벳, 숫자, _@ 를 소문 자로 시작한다.
    Hello = hello.
    OtherNode = example@node.
    

    Atom 에 특수 문자 가 포함 되 어 있 으 면 작은 따옴표 로 묶 을 수 있 습 니 다.
    AtomWithSpace = 'some atom with space'.
    

    Erlang 의 원 조 는 C 와 유사 한 struct 입 니 다.
    Point = {point, 10, 45}.
    

    패턴 일치 연산 자 = 를 사용 하여 원 그룹의 값 을 가 져 옵 니 다.
    {point, X, Y} = Point.  % X = 10, Y = 45
    

    우 리 는 _ 우리 가 관심 이 없 는 변 수 를 저장 할 수 있다._ 익명 변수 라 고 불 린 다.다른 변수 와 달리 같은 모드 의 여러 개 _ 변 수 는 같은 값 에 연결 할 필요 가 없습니다.
    Person = {person, {name, {first, joe}, {last, armstrong}}, {footsize, 42}}.
    {_, {_, {_, Who}, _}, _} = Person.  % Who = joe
    

    목록 은 괄호 를 사용 하고 요소 간 에는 쉼표 로 구분 합 니 다.목록 의 요 소 는 임의의 형식 일 수 있 습 니 다.목록 의 첫 번 째 요 소 는 목록 의 head 라 고 하고 나머지 요 소 는 목록 의 tail 이 라 고 합 니 다.
    ThingsToBuy = [{apples, 10}, {pears, 6}, {milk, 3}].
    
    T 이 하나의 목록 이 라면 [H|T] 역시 하나의 목록 입 니 다. head 는 H 이 고, tail 은 T 입 니 다. | 목록 을 구분 하 는 head 와 tail. [] 은 빈 목록 입 니 다.목록 에 있 는 요 소 를 추출 하기 위해 서 패턴 일치 동작 을 사용 할 수 있 습 니 다.만약 에 우리 가 비어 있 지 않 은 목록 L 이 있다 면 [X|Y] = L 은 L 의 head 에서 X, tail 에서 Y (X, Y 는 정의 되 지 않 은 변수) 를 추출 합 니 다.
    [FirstThing|OtherThingsToBuy] = ThingsToBuy.
    % FirstThing = {apples, 10}
    % OtherThingsToBuy = {pears, 6}, {milk, 3}
    

    Erlang 의 문자열 은 정수 로 구 성 된 배열 입 니 다.문자열 은 더 블 따옴표 를 사용 합 니 다.
    Name = "Hello".
    [72, 101, 108, 108, 111] = "Hello".
    

    2. 순차 프로 그래 밍
    Module 은 Erlang 코드 의 기본 단위 입 니 다.우리 가 작성 한 모든 함 수 는 module 에 저장 되 어 있다.모듈 은 접미사 .erl 파일 에 저 장 됩 니 다.Module 은 사전에 컴 파일 해 야 합 니 다.컴 파일 된 module 은 .beam 로 끝 납 니 다.
    -module(geometry).
    -export([area/1]). % module 对外暴露的函数列表
    
    area 함 수 는 두 개의 문장 을 포함 하고 문장 간 에 분점 으로 구분 된다.마지막 문장 은 마침표 에 줄 을 바 꾸 어 끝난다.각 문장 은 머리 와 몸 두 부문 으로 구성 된다.머리 에는 함수 이름과 괄호 로 묶 은 패턴 이 포함 되 어 있 으 며, 몸 에는 일련의 표현 식 이 포함 되 어 있 으 며, 머리 패턴 이 호출 된 매개 변수 와 일치 하면 이 표현 식 들 은 연산 된다.패턴 매 칭 은 정 의 된 순서대로 진 행 됩 니 다.
    area({rectangle, Width, Ht}) -> Width * Ht;
    area({circle, R})            -> 3.14159 * R * R.
    

    파일 을 geometry. erl 로 컴 파일 합 니 다.
    c(geometry).  % {ok,geometry}
    

    함 수 를 호출 할 때 는 module 이름과 함수 명 을 사용 해 야 합 니 다.
    geometry:area({rectangle, 10, 5}).  % 50
    geometry:area({circle, 1.4}).  % 6.15752
    

    Erlang 에 서 는 같은 모듈 에서 매개 변수 수가 다 르 고 이름 이 같은 함 수 는 완전히 다른 함수 입 니 다.
    -module(lib_misc).
    -export([sum/1]). % 对外暴露的`sum`函数接受一个参数:由整数组成的列表。
    sum(L) -> sum(L, 0).
    sum([], N)    -> N;
    sum([H|T], N) -> sum(T, H+N).
    

    fun 은 익명 함수 입 니 다.이름 은 없 지만 변 수 를 할당 할 수 있 습 니 다.
    Double = fun(X) -> 2*X end. % `Double` 指向匿名函数 #Fun
    Double(2).  % 4
    

    fun 는 함수 의 매개 변수 와 반환 값 으로 사용 할 수 있 습 니 다.
    Mult = fun(Times) -> ( fun(X) -> X * Times end ) end.
    Triple = Mult(3).
    Triple(5).  % 15
    

    목록 분석 은 목록 을 만 드 는 표현 식 (fun, map 또는 filter 를 사용 하지 않 음) 입 니 다.[F(X) || X 表示 "由 F(X) 로 구 성 된 목록 중 X 은 목록 L 에서 추출 합 니 다.
    L = [1,2,3,4,5].
    [2*X || X 

    목록 분석 은 생 성 기 를 사용 할 수도 있 고 필 터 를 사용 할 수도 있 습 니 다. 필 터 는 목록 의 일부분 을 선별 하 는 데 사 용 됩 니 다.
    EvenNumbers = [N || N 

    Guard 는 증강 모드 에 맞 는 구조 입 니 다.Guard 는 간단 한 테스트 와 비교 에 사용 할 수 있 습 니 다.Guard 는 함수 가 정의 하 는 머리 에 사용 할 수 있 습 니 다. when 키워드 로 시작 하거나 표현 식 을 사용 할 수 있 는 다른 곳 입 니 다.
    max(X, Y) when X > Y -> X;
    max(X, Y) -> Y.
    

    guard 는 일련의 guard 표현 식 으로 구성 되 며, 이 표현 식 들 은 쉼표 로 구 분 됩 니 다.GuardExpr1, GuardExpr2, ..., GuardExprN 은 진실 이 고 모든 guard 표현 식 이 진실 일 때 만 가능 합 니 다.
    is_cat(A) when is_atom(A), A =:= cat -> true;
    is_cat(A) -> false.
    is_dog(A) when is_atom(A), A =:= dog -> true;
    is_dog(A) -> false.
    

    guard 시퀀스 G1; G2; ...; Gn 는 진실 이 며, 그 중 임의의 guard 표현 식 만 진실 이 라 고 생각 합 니 다.
    % one of the guards `G1, G2, ...` evaluates to true.
    is_pet(A) when is_dog(A); is_cat(A) -> true;
    is_pet(A) -> false.
    

    Record 는 원 그룹의 요 소 를 특정한 이름 으로 연결 할 수 있 습 니 다.Record 정 의 는 Erlang 소스 코드 에 포함 할 수도 있 고 접미사 .hrl 파일 에 넣 을 수도 있 습 니 다 (Erlang 소스 코드 에 이 파일 들 을 포함 합 니 다).
    -record(todo, {
      status = reminder,  % Default value
      who = joe,
      text
    }).
    

    어떤 record 를 정의 하기 전에 셸 에서 record 의 정 의 를 가 져 와 야 합 니 다.우 리 는 셸 함수 rr (read records 의 약칭) 를 사용 할 수 있다.
    rr("records.hrl").  % [todo]
    

    record 를 만 들 고 업데이트 합 니 다.
    X = #todo{}.
    % #todo{status = reminder, who = joe, text = undefined}
    X1 = #todo{status = urgent, text = "Fix errata in book"}.
    % #todo{status = urgent, who = joe, text = "Fix errata in book"}
    X2 = X1#todo{status = done}.
    % #todo{status = done,who = joe,text = "Fix errata in book"}
    
    case 표현 식 입 니 다. filter 목록 L 의 모든 만족 P(x) 이 진짜 요소 X 로 구 성 된 목록 을 되 돌려 줍 니 다.
    filter(P, [H|T]) ->
      case P(H) of
        true -> [H|filter(P, T)];
        false -> filter(P, T)
      end;
    filter(P, []) -> [].
    filter(fun(X) -> X rem 2 == 0 end, [1, 2, 3, 4]). % [2, 4]
    
    if 표현 식.
    max(X, Y) ->
      if
        X > Y -> X;
        X < Y -> Y;
        true -> nil;
      end.
    

    경고: if 표현 식 에 최소한 하나의 guard 가 있 습 니 다. 그렇지 않 으 면 이상 이 발생 합 니 다.
    3. 이상
    내부 오류 나 현식 호출 이 발생 하면 이상 이 발생 합 니 다. 현식 호출 은 throw(Exception), exit(Exception), erlang:error(Exception) 를 포함 합 니 다.
    generate_exception(1) -> a;
    generate_exception(2) -> throw(a);
    generate_exception(3) -> exit(a);
    generate_exception(4) -> {'EXIT', a};
    generate_exception(5) -> erlang:error(a).
    

    Erlang 은 이상 을 포착 하 는 두 가지 방법 이 있 습 니 다. 하 나 는 try...catch 표현 식 에 소 포 를 호출 하 는 것 입 니 다.
    catcher(N) ->
      try generate_exception(N) of
        Val -> {N, normal, Val}
      catch
        throw:X -> {N, caught, thrown, X};
        exit:X -> {N, caught, exited, X};
        error:X -> {N, caught, error, X}
      end.
    

    다른 방법 은 소 포 를 catch 표현 식 에 호출 하 는 것 입 니 다. 이 때 이상 은 잘못된 원 그룹 으로 전 환 됩 니 다.
    catcher(N) -> catch generate_exception(N).
    

    4. 병발
    Erlang 은 actor 병렬 모델 에 의존 합 니 다. Erlang 에서 병렬 프로그램 을 작성 하 는 세 가지 요소: 프로 세 스 를 만 들 고 메 시 지 를 보 내 며 메 시 지 를 받 습 니 다.
    새로운 프로 세 스 를 시작 합 니 다. spawn 함 수 를 매개 변수 로 받 습 니 다.
    F = fun() -> 2 + 2 end. % #Fun
    spawn(F). % <0.44.0>
    
    spawn 함수 가 pid (프로 세 스 식별 자) 를 되 돌려 줍 니 다. pid 를 사용 하여 프로 세 스에 메 시 지 를 보 낼 수 있 습 니 다. ! 연산 자 를 사용 하여 메 시 지 를 보 낼 수 있 습 니 다. 프로 세 스 내 에서 메 시 지 를 받 아야 합 니 다. receive 메커니즘 을 사용 해 야 합 니 다.
    -module(caculateGeometry).
    -compile(export_all).
    caculateAera() ->
        receive
          {rectangle, W, H} ->
            W * H;
          {circle, R} ->
            3.14 * R * R;
          _ ->
            io:format("We can only caculate area of rectangles or circles.")
        end.
    

    이 모듈 을 컴 파일 하여 셸 에 프로 세 스 를 만 들 고 caculateArea 함 수 를 실행 합 니 다.
    c(caculateGeometry).
    CaculateAera = spawn(caculateGeometry, caculateAera, []).
    CaculateAera ! {circle, 2}. % 12.56000000000000049738
    

    셸 도 프로 세 스 (process) 입 니 다. self 를 사용 하여 현재 pid 를 가 져 올 수 있 습 니 다.
    self(). % <0.41.0>
    

    References
  • "Learn You Some Erlang for great good!"
  • "Programming Erlang: Software for a Concurrent World"by Joe Armstrong
  • Erlang/OTP Reference Documentation
  • Erlang - Programming Rules and Conventions

  • 원문 Learn X in Y minutes, where X = Erlang by contributors 번역 SegmentFault 허가 CC - BY - SA

    좋은 웹페이지 즐겨찾기