Warning: strpos() [function.strpos]: Empty needle in /home/dealer/kasat/pkg/cahir/web/html/lib/plugins/translation2/action.php on line 53

Warning: Cannot modify header information - headers already sent by (output started at /home/dealer/kasat/pkg/cahir/web/html/lib/plugins/translation2/action.php:53) in /home/dealer/kasat/pkg/cahir/web/html/inc/actions.php on line 163
erlang:intro [Krystian Bacławski Wiki]
 

Pierwsze kroki

Wejście i wyjście

Moduł IO

Specyfikacja:

  • io:get_line( Prompt ) → String – wczytaj linię.
  • io:get_chars( Prompt, Num ) → String – wczytaj zadaną ilość znaków.
  • io:read( Prompt ) → Tuple – wczytaj zredukowane wyrażenie erlangowe.
  • io:format( String, List ) → Atom – odpowiednik printf.

Przykłady:

1> io:get_line("prompt> ").
prompt> jako taki tekst
"jako taki tekst\n"
2> io:get_chars("prompt> ", 6).
prompt> erlang
"erlang"
3> io:read("prompt> ").
prompt> {1,2,"foobar"}
{ok,{1,2,"foobar"}}
4> io:read("prompt> ").
prompt> 1+2.
{error,{1,erl_parse,"bad term"}}

Formatki

Funkcja io:format/2 akceptuje następujące formatki:

  • ~B – liczba dziesiętna.
  • ~f – liczba zmiennopozycyjna.
  • ~e – j.w ale w notacji naukowej.
  • ~w / ~p – dowolny term, bez lub z ładnym formatowaniem.
  • ~W / ~P – j.w ale o tylko do podanej głębokości.

Przykłady:

1> List = [ 10, 4, 5.0, 2.5, 3 ].
{10,4,5.0,2.5,3}
2> Sum = lists:sum(List).
24.5
3> io:format("suma listy ~w wynosi ~w.~n", [List, Sum] ).
suma listy [10,4,5.0,2.5,3] wynosi 24.5.
ok
4> io:format("suma listy ~W wynosi ~w.~n", [List, 3, Sum] ).
suma listy [10,4|...] wynosi 24.5.
ok

Uruchamianie programów w Erlangu

Program Hello World!

-module(hello).
-export([start/0]).
 
start() ->
io:format("Hello world!~n").

Uruchomienie z powłoki erlangowej:

Eshell V5.7.2  (abort with ^G)
1> c(hello).
{ok, hello}
2> hello:start().
Hello world!
ok

Uruchomienie z linii poleceń:

$ erlc hello.erl
$ erlc -noshell -s hello start -s init stop
Hello world!
$

Lekko zmodyfikowany przykład

#!/usr/bin/env escript
 
main(_)->
  io:format("Hello world!\n").

Należy go zapisać na dysk do pliku o nazwie hello, a następnie z powłoki systemowej wykonać:

$ chmod u+x hello
$ ./hello
Hello world!
$

Zauważcie, że zignorowaliśmy argument do funkcji main!

Kilka przykładów rozgrzewkowych

Zliczanie elementów w liście

 1: -module(example1).
 2: -export([flat_length/1]).
 3:
 4: % oblicza ilosc elementow w liscie
 5: % przepatruje rekurencyjnie
 6: flat_length(List) ->
 7:   flat_length(List,0).
 8:
 9: flat_length([H|T], N) when is_list(H) ->
10:   flat_length(H, flat_length(T, N));
11: flat_length([H|T], N ) ->
12:   flat_length([H|T], N+1);
13: flat_length([], N ) ->
14:   N.

Silnia na cztery sposoby

 1: -module(example2).
 2: -export([factorial1/1,factorial2/1,factorial3/1,factorial4/1]).
 3:
 4: factorial1(0) -> 1;
 5: factorial1(N) -> N * factorial1(N - 1).
 6:
 7: factorial2(0) -> 1;
 8: factorial2(N) when N > 0 -> N * factorial2(N - 1).
 9:
10: factorial3(N) ->
11:   if
12:     N == 0 -> 1;
13:     N > 0 -> N * factorial3(N - 1)
14:   end.
15:
16: factorial4(N) ->
17:   case N of
18:     0 -> 1;
19:     N when N > 0 ->
20:     N * factorial4(N - 1)
21:   end.

Quicksort - rozwiązanie tradycyjne

 1: -module(sort).
 2: -export([sort/1]).
 3:
 4: sort([]) ->
 5:   [];
 6: sort([Pivot|Rest]) ->
 7:   {Smaller, Bigger} = split(Pivot, Rest),
 8:   lists:append(sort(Smaller), [Pivot|sort(Bigger)]).
 9:
10: split(Pivot, L) ->
11:   split(Pivot, L, [], []).
12: split(Pivot, [], Smaller, Bigger) ->
13:   {Smaller,Bigger};
14: split(Pivot, [H|T], Smaller, Bigger) when H < Pivot ->
15:   split(Pivot, T, [H|Smaller], Bigger);
16: split(Pivot, [H|T], Smaller, Bigger) when H >= Pivot ->
17:   split(Pivot, T, Smaller, [H|Bigger]).

Quicksort - rozwiązanie Erlangowe

1: -module(sort2).
2: -export([sort2/1]).
3:
4: sort2([]) -> [];
5: sort2([Pivot|Rest]) ->
6:   sort2([Front || Front <- Rest, Front < Pivot])
7:   ++ [Pivot] ++
8:   sort2([Back || Back <- Rest, Back >= Pivot]).
 
erlang/intro.txt · Last modified: 2010/05/07 22:35 by Krystian Bacławski
 
Except where otherwise noted, content on this wiki is licensed under the following license:CC Attribution-Noncommercial-No Derivative Works 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki