Start programming erlang.
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -4,6 +4,7 @@
|
|||||||
*.o
|
*.o
|
||||||
*.pdf
|
*.pdf
|
||||||
.d
|
.d
|
||||||
|
*.beam
|
||||||
|
|
||||||
# ignore build systems
|
# ignore build systems
|
||||||
.ninja_deps
|
.ninja_deps
|
||||||
|
|||||||
25
pe/afile_client.erl
Normal file
25
pe/afile_client.erl
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
-module(afile_client).
|
||||||
|
-compile([debug_info]).
|
||||||
|
-export([ls/1, get_file/2, put_file/3]).
|
||||||
|
|
||||||
|
ls(Server) ->
|
||||||
|
Server ! {self(), list_dir},
|
||||||
|
receive
|
||||||
|
{Server, FileList} ->
|
||||||
|
FileList
|
||||||
|
end.
|
||||||
|
|
||||||
|
get_file(Server, File) ->
|
||||||
|
Server ! {self(), {get_file, File}},
|
||||||
|
receive
|
||||||
|
{Server, Content} ->
|
||||||
|
Content
|
||||||
|
end.
|
||||||
|
|
||||||
|
put_file(Server, File, Contents) ->
|
||||||
|
Server ! {self(), {put_file, File, Contents}},
|
||||||
|
receive
|
||||||
|
{Server, Result} ->
|
||||||
|
Result
|
||||||
|
end.
|
||||||
|
|
||||||
37
pe/afile_server.erl
Normal file
37
pe/afile_server.erl
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
-module(afile_server).
|
||||||
|
-compile([debug_info]).
|
||||||
|
-export([start/1, loop/1]).
|
||||||
|
|
||||||
|
start(Dir) ->
|
||||||
|
spawn(afile_server, loop, [Dir]).
|
||||||
|
|
||||||
|
%% Three significant points to observer about this code:
|
||||||
|
%%
|
||||||
|
%% + Who to reply to: all the received messages contain
|
||||||
|
%% the variable Client - the PID of the sender.
|
||||||
|
%% + Use of self(): the PID of the server.
|
||||||
|
%% + Pattern matching to select the message.
|
||||||
|
loop(Dir) ->
|
||||||
|
receive
|
||||||
|
{Client, list_dir} ->
|
||||||
|
Client ! {self(), file:list_dir(Dir)};
|
||||||
|
{Client, {get_file, File}} ->
|
||||||
|
Full = filename:join(Dir, File),
|
||||||
|
Client ! {self(), file:read_file(Full)};
|
||||||
|
{Client, {put_file, File, Contents}} ->
|
||||||
|
Full = filename:join(Dir, File),
|
||||||
|
Client ! {self(), file:write_file(Full, Contents)},
|
||||||
|
{Client, ping} ->
|
||||||
|
Client ! {self(), pong};
|
||||||
|
{Client, _} ->
|
||||||
|
Client ! {self(), unrecognised_message};
|
||||||
|
{_} ->
|
||||||
|
io:format("unhandled message")
|
||||||
|
end,
|
||||||
|
loop(Dir).
|
||||||
|
|
||||||
|
%% Notes:
|
||||||
|
%% + function names are always lowercased
|
||||||
|
%% + universal receiver: receive X -> X end.
|
||||||
|
%% + erlang: use processes to structure the solutions to our problems.
|
||||||
|
%% + *ATOMS*ARE*LOWER*CASED*
|
||||||
11
pe/geometry.erl
Normal file
11
pe/geometry.erl
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
-module(geometry).
|
||||||
|
-export([area/1]).
|
||||||
|
|
||||||
|
area({rectangle, Width, Height}) ->
|
||||||
|
Width * Height;
|
||||||
|
area({circle, Radius}) ->
|
||||||
|
3.14159 * Radius * Radius;
|
||||||
|
area({square, Side}) ->
|
||||||
|
Side * Side.
|
||||||
|
|
||||||
|
|
||||||
14
pe/heads.erl
Normal file
14
pe/heads.erl
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
-module(heads).
|
||||||
|
-export([len/1]).
|
||||||
|
|
||||||
|
alen([], Count) ->
|
||||||
|
Count;
|
||||||
|
|
||||||
|
alen([_|T], Count) ->
|
||||||
|
alen(T, Count+1).
|
||||||
|
|
||||||
|
len([_|T]) ->
|
||||||
|
alen(T, 1);
|
||||||
|
|
||||||
|
len([]) ->
|
||||||
|
0.
|
||||||
5
pe/hello.erl
Normal file
5
pe/hello.erl
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
-module(hello).
|
||||||
|
-export([start/0]).
|
||||||
|
|
||||||
|
start() ->
|
||||||
|
io:format("Goodbye, joe.~n").
|
||||||
4
pe/shop.erl
Normal file
4
pe/shop.erl
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
-module(shop).
|
||||||
|
-export([cost/1]).
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user