2011-10-04 2 views
5

기능적 언어에 대한 경험이 거의없는 C/C++ 프로그래머 그룹에게 작은 프리젠 테이션을 제공하고 있습니다. 프리젠 테이션의 일부에는 Erlang이 언급되어 있으며, 구체적인 작은 코드 예제를 제공하고자합니다.얼랭 코드 스 니펫은 그 이점을 과시합니까?

Erlang이 사용되는 방법과 장점에 대한 StackOverflow에 대한 엄청난 정보가 있습니다. 내가 볼 수있는 가장 보편적 인 이점 중 하나는 C/C++과 비교할 때 좀 더 간결한 코드로 많은 것을 할 수 있다는 것입니다.

나는 이러한 유형의 이점을 설명하는 Erlang의 코드 스 니펫을 찾고 있습니다. 특히 몇 줄의 Erlang에서 쉽게 할 수있는 것은 C/C++에서 훨씬 더 복잡합니다.

누구든지 흥미로운 제안이 있으십니까?

+0

체크 아웃 피타고라스 수 –

답변

4

Erlang의 비트 구문에 대한 훌륭한 예는 example 4을 확인하십시오. 구문의 간결함을 이해할 수있는 c/C++ 개발자가 많이 있습니다!

+0

나는 내 새로운 대답을 이것은 Erlang의 강점을 기능적 프로그래밍의 강점을 보여주는만큼 보여주지는 못하지만, 이것과 같습니다. –

3

필자는 동시성을 수행하는 것이 얼마나 쉬운 지 보여주는 예제를 사용할 것입니다.

기본적으로 map-reduce를 작성합니다 (단, C 프로그래머에게 설명하기 위해이 단어를 사용하지 마십시오).

Fizz Buzz을 재생하는 프로그램을 시작한 다음 계속 진행할 수 있습니다. 화이트 보드 또는 파워 포인트 두 페이지에 쉽게 맞아야합니다.

+0

우연히도 Fizz Buzz와 같은 흥미로운 아이디어는이 그룹에서 흔히 사용되는 예입니다! –

3

동료 예로 들어 병합-정렬을 사용하여 제안 :

http://rosettacode.org/wiki/Sorting_algorithms/Merge_sort#Erlang

mergeSort(L) when length(L) == 1 -> L; 
mergeSort(L) when length(L) > 1 -> 
    {L1, L2} = lists:split(length(L) div 2, L), 
    lists:merge(mergeSort(L1), mergeSort(L2)). 

멀티 프로세스 버전 :

pMergeSort(L) when length(L) == 1 -> L; 
pMergeSort(L) when length(L) > 1 -> 
    {L1, L2} = lists:split(length(L) div 2, L), 
    spawn(mergesort, pMergeSort2, [L1, self()]), 
    spawn(mergesort, pMergeSort2, [L2, self()]), 
    mergeResults([]). 

pMergeSort2(L, Parent) when length(L) == 1 -> Parent ! L; 
pMergeSort2(L, Parent) when length(L) > 1 -> 
    {L1, L2} = lists:split(length(L) div 2, L), 
    spawn(mergesort, pMergeSort2, [L1, self()]), 
    spawn(mergesort, pMergeSort2, [L2, self()]), 
    Parent ! mergeResults([]). 
2

계승 코드는 내가이 최고입니다 항상 짧은 얼랭 프로그램의 길이를 보여주기 위해 사용됩니다

 
-module(factorial). 
-export([calculate/1]). 

calculate(0) -> 1; 
calculate(N) -> N * calculate(N -1). 

간단합니다. 이 짧은 프로그램은 Erlang 프로그램의 짧은 길이뿐만 아니라, Pattern Matching, Function ClausesLast Call Optimization을 보여줍니다.

나는 항상 아래, 같은의 C++ 버전을했다 :

 

#include<iostream.h> 
#include<conio.h> 

long factorial(unsigned int a); 

void main() { 
    unsigned int a; 
    long fac; 
    ..... 
    ..... 
    return factorial(a); 
} 

long factorial(unsigned int x) { 
     long fac=1; 
     if(x == 0) {return 1;} 
     else { 
       while(x > 0) { 
        fac *= x; 
        x -= 1 ; 
       } 
     return fac; } 
} 

글쎄,이 짧은 C++ 버전이 아닐 수도 있습니다,하지만 난 당신이 생각을 알고있다.

+1

C/C++에서 재귀를 사용할 수 있습니다. C/C++의 동등한 함수는 다음과 같습니다.'int factorial (int N) { if (N == 0) return 1; else return N * 계승 (N-1); }' –

+0

완벽! 내 C++은 최악이다. 고마워 @ MustafaOzturk –

+1

위의 Erlang 팩토리얼 코드는 마지막 호출을 최적화 할 수 없습니다. 마지막 호출은 N에 의한 곱셈이며, 1을 계산하기위한 첫 번째 호출이 완료되기 전에 임의의 스택 반환 횟수를 기다리고 있습니다. LCO가 작동하려면 누산기로 반복하려면 calculate/2가 필요합니다. – zxq9

2

피타고라스의 트리플. 피타고라스 (Phthagoras)에 따라 3 개의 숫자가 직각 삼각형을 이루도록 30 이하의 모든 숫자 조합을 가져옵니다.

[{X,Y,Z} || X <- lists:seq(1,30), 
      Y <- lists:seq(1,30), 
      Z <- lists:seq(1,30), ((X * X) + (Y * Y)) == (Z * Z)]. 

는 C/C++로 그 일을 시도하거나 Java 및 경우에 당신이 for loop을 피할 수 있는지 확인하지 더 스킬 레벨에 따라보다 :)

관련 문제