Erlang Checkpoint
Simple Functions
Remember that Erlang uses the concept of pattern matching.
- 1. Create the file fact.erl as follows.
-module(fact). -export([fac/1]). fac(0) -> 1; fac(N) when N > 0 -> N * fac(N-1).
- 2. Compile the file in an Erlang shell (execute the command "c(fact)." ) and then call it for different values. Remember that you call the function by executing this command "fact:fac(9)." .
Lists and List Comprehension
Below is an implementation of a Quicksort algorithm.
%% quicksort:qsort(List) %% Sort a list of items -module(quicksort). -export([qsort/1]). qsort([]) -> []; qsort([Pivot|Rest]) -> qsort([ X || X <- Rest, X < Pivot]) ++ [Pivot] ++ qsort([ Y || Y <- Rest, Y >= Pivot]).
The above example recursively invokes the function qsort until nothing remains to be sorted. The expression [ X || X <- Rest, X < Pivot] means "Choose all X where X is a member of Rest and X is less than Pivot", resulting in a very easy way of handling lists.
Concurrency and Distribution Oriented Language
Process communication is done via a share-nothing asynchronous message-passing system: every process has a "mailbox", a queue of messages sent by other processes, that are not yet consumed. A process uses the receive primitive to retrieve messages that match desired patterns. A message-handling routine tests messages in turn against each pattern, until one of them matches. When the message is consumed (removed from the mailbox) the process resumes execution. A message may comprise any Erlang structure, including primitives (integers, floats, characters, atoms), tuples, lists, and functions.
Code examples:
% execute function Func from module Mod as new process with arguments Args Pid = spawn(Mod, Func, Args) % execute function Func from module Mod in remote node Node with arguments Args Pid = spawn(Node, Mod, Func, Args) Pid ! a_message % send message to the process (asynchronously) receive % receive message sent to this process a_message -> do_something; {data, Data_content} -> do_something_else(); % This is a tuple of a type atom and some data {hello, Text} -> io:format("Got hello message: ~s", [Text]); {goodbye, Text} -> io:format("Got goodbye message: ~s", [Text]) end.