Introduction to Erlang. Using the Shell. Variables. Compilation and running of simple programs/functions. Running Erlang VM from the command line.
In case of trouble take a look at: http://www.erlang.org
To enter the Erlang shell run erl
command from a terminal.
Calculate: 3+2*10
and (3+2)*10
What are the results? Does arithmetic operator precedence work?
Repeat calculations from the previous exercise, but this time assign the results to variables:
O=3+2*10.
P=(3+2)*10.
What does the following command do?
O+P.
Try the following, does it work? Why?
P=0.
Using the shell internal commands (see help(). for help ) investigate what variables are defined in your shell.
Delete (forget) variable P binding. Does the following work now? Why?
P=0.
Try the following:
2=2.
What is the result? And now:
2==2.
Is there a difference why?
true
or false
.Try the following and observe the results.
3+1 = 2+2. 2*3 == 5+1. 4/2 =:= 1+1. 5 rem 3. 5 div 3. 5/3 = 15/9. 5/3 =:= 15/9. 5/3 == 15/9. 1.0 + 3 =:= 2+2. 1.0 + 3 == 2+2. 1.0 + 3 = 2+2. 1.0 + 3 = 2+2 + 0.0.
For more comparison operators see the manual at http://www.erlang.org
Create a file my1.erl with a factorial function.
Use your favorite text editor.
Remember about the compiler directives -module().
and -export().
You may also use -compile(export_all).
feature for now.
Run erl in the same directory as my1.erl
Compile my1.erl
c(my1).
Test if the factorial function works.
Is factorial(400) doable? Can your pocket calculator do that? Experiment with some greater numbers.
Factorial(-5) does it work? Did you use guards while implementing the function?
If your program entered an infinite loop (it is not respoding) use one of the methods from the lecture to terminate it: Use ^G, investigate different user shell commands
You can experiment with the user shell commands i.e. you are free to start as many shell as you like and switch among them.
Leave erl
by issuing:
q().
Enter erl
again.
Try running the factorial function without prior compilation. Does it work? It should!
Investigate the following matches:
[F,S|Rest] = [a,b,c,1,2,3].
What is the value of: F
, S
, Rest
?
Try the following:
A=1. L=[A|[2,3]]. [[3,2]|1].
Does the following match?
[H1|T1]=[].
[H2|T2]=[{salary,{fred,18000}}].
What are the values of: H1
, T1
, H2
, T2
?
Suppose that you want to extract information about somebody's salary.
Assuming that H2
is already bound to the tuple describing it try the following:
{_,{_,S}}=H2, S.
What is the returned value? Why? Is S
bound?
Write a function ml/1
which returns the greatest number on the list. Do not use max(L)
BIF!
Here is a simple program which implements a function get_data/1
which reads data from a file.
The file's name is given as its argument.
The data in the file is given as floating point numbers separated with new lines.
process/1
displays data on the standard output, the numbers are separated with commas.
Read the code. Is it clear to you? Test it on the data file from the previous exercise. Does it work?
get_data(Name) -> case file:open(Name,[read]) of {ok,FD} -> Val=process(FD), file:close(FD), Val; Error -> Error end. process(FD) -> case io:fread(FD,'',"~f") of {ok,Value} -> io:format("~f, ",Value), process(FD); Err -> Err end.
Change process/1
to display the numbers line by line.
Rewrite process/1
not using the case … of …
statement.
Write a function go/0
which reads data from ac_current.dat using get_data/1
.