2011-10-04 25 views
5

Tôi đang đưa ra một bài thuyết trình nhỏ cho một nhóm lập trình viên C/C++, những người có rất ít kinh nghiệm với các ngôn ngữ chức năng. Một phần của bài trình bày đề cập đến Erlang và tôi muốn đưa ra một ví dụ mã nhỏ cụ thể.Đoạn mã Đoạn mã Erlang thể hiện lợi ích của nó?

Có rất nhiều thông tin tuyệt vời về StackOverflow về cách thức/nơi Erlang được sử dụng và lợi thế của nó. Một trong những lợi thế phổ biến nhất mà tôi thấy là làm thế nào nó có thể làm được rất nhiều chỉ với một chút mã terse, đặc biệt là so với C/C++.

Tôi đang tìm đoạn mã tốt của Erlang chỉ đơn giản minh họa các loại lợi ích này. Đặc biệt là một cái gì đó thats dễ dàng thực hiện trong Erlang với vài dòng, đó sẽ là phức tạp hơn nhiều trong C/C++.

Bất kỳ ai có bất kỳ đề xuất thú vị nào?

+0

Kiểm tra câu trả lời mới của tôi trên Bộ ba số Pythagore –

Trả lời

4

Khám phá example 4 để có ví dụ tuyệt vời về cú pháp bit của Erlang. Tôi chắc rằng có một số nhà phát triển c/C++ sẽ đánh giá cao tính ngắn gọn của cú pháp!

+0

tôi như thế này, mặc dù nó không thực sự thể hiện sức mạnh của Erlang nhiều như nó thể hiện những điểm mạnh của Lập trình chức năng. –

3

Tôi sẽ sử dụng ví dụ cho thấy việc thực hiện đồng thời dễ dàng như thế nào.

Vì vậy, về cơ bản viết bản đồ-giảm (nhưng không bao giờ sử dụng từ đó để mô tả nó cho một lập trình viên C).

Bạn có thể bắt đầu bằng cách hiển thị chương trình phát Fizz Buzz và sau đó tiếp tục thực hiện đồng thời. Có thể dễ dàng vừa với bảng trắng hoặc hai trang powerpoint.

+0

Ý tưởng thú vị đối với tôi như tình cờ Fizz Buzz là một ví dụ thường được sử dụng với nhóm này! –

3

một đồng nghiệp đề nghị sử dụng Merge-Sắp xếp như một ví dụ:

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)). 

phiên bản Multi-quá trình:

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

đoạn mã thừa là tốt nhất tôi có luôn được sử dụng để hiển thị cách các chương trình xóa ngắn có thể là

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

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

Đơn giản như vậy. Chương trình ngắn đó minh họa không chỉ cách các chương trình Erlang ngắn có thể, mà còn: Pattern Matching, Function ClausesLast Call Optimization.

Tôi luôn luôn có một ++ phiên bản C của cùng, bên dưới:

 

#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; } 
} 

Vâng, điều này có thể không phải là phiên bản ++ C ngắn nhất, nhưng tôi biết bạn có được ý tưởng.

+1

Bạn có thể sử dụng đệ quy trong C/C++. Một hàm tương đương trong C/C++ sẽ là: 'int factorial (int N) { if (N == 0) return 1; khác trả về giai thừa N * (N-1); } ' –

+0

hoàn hảo! C++ của tôi là tồi tệ nhất. Cảm ơn @MustafaOzturk –

+1

Nhưng mã giai thừa Erlang ở trên không phải là cuộc gọi cuối cùng có thể tối ưu hóa. Cuộc gọi cuối cùng là phép nhân của N, đang chờ một số lượng trả về stack tùy ý trước khi cuộc gọi đầu tiên tính/1 có thể hoàn thành. Cần tính toán/2 để lặp lại với bộ tích lũy để LCO hoạt động. – zxq9

2

Tam giác Pythagore. Nhận tất cả các kết hợp số dưới 30, theo đó 3 số tạo thành hình tam giác vuông góc phù hợp theo Pythagoras.

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

Hãy thử làm điều đó trong C/C++, hoặc Java và xem nếu bạn sẽ tránh được một for loop nếu không muốn nói nhiều hơn một tùy thuộc vào mức độ kỹ năng của bạn :)