Erlang for Python programmers: Part II
In this short tutorial we will take a look at comparison operations, some arithmetic operations and modules. You may also want to skim over Inro and Part I.
Comparison operations
Python Erlang Description Erlang Example
--------+--------+-----------------------+----------------
< < strictly less than
--------+--------+-----------------------+----------------
<= =< less than or equal
--------+--------+-----------------------+----------------
> > strictly greater than
--------+--------+-----------------------+----------------
>= >= greater than or equal
--------+--------+-----------------------+----------------
!= /= not equal
--------+--------+-----------------------+----------------
== == equal 1> 1 == 1.
true
2> 1 == 1.0.
true
--------+--------+-----------------------+----------------
=:= exactly equal to 1> 1 =:= 1.
true
2> 1 =:= 1.0.
false
--------+--------+-----------------------+----------------
=/= exactly not equal to
--------+--------+-----------------------+----------------
is object identity
--------+--------+-----------------------+----------------
is not negated obj identity
Python notes
Above comparison operations are supported by all objects. In Python you can chain comparisons:
>>> x, y, z = 1, 3, 7 >>> x < y <= z True >>> x < y and y <= z True
Foregoing examples are identical, except that in second case y is evaluated twice.
Erlang notes
Following order is defined:
number < atom < reference < fun < port < pid < tuple < list < binary
1> 5 < erlang. true 2> erlang < make_ref(). true
Both Erlang comparison operators (<, =<, >, >=, /=, ==) and Python comparison operators(<, <=, >, >=, !=, ==) make type coerce, “narrower” type is widened to that of another, ie when comparing integer and float first integer is converted to float, etc.
Erlang has special operators without type coerce though: =:= and =/=
Arithmetic operations
I’ll provide only several operations, for more take a look at corresponding language references.
Python Python Desc. Erlang Erlang Desc. Example
--------+--------------------+---------+--------------+--------------------
x % y remainder X rem Y integer >>> 7 % 3
of x / y remainder 1
of X / Y >>> 7.0 % 3
1.0
1> 7 rem 3.
1
1> 7.0 rem 3.
=ERROR REP..
--------+--------------------+---------+--------------+--------------------
x / y quotient X / Y floating >>> 7 / 3
of x and y point 2
division >>> 7.0 / 3
2.3333333333333335
1> 7 / 3.
2.33333
--------+--------------------+---------+--------------+--------------------
x // y (floored) quotient X div Y integer >>> 7 // 3
of x and y, division 2
integer division >>> 7.5 // 3
(result type is 2.0
not forced to be
int) 1> 7 div 3.
2
Modules
Code in Erlang is organized into units called modules, which is familiar word for Python programmer.
Let’s define sample module with function declaration stored in file mymath.erl :
-module(mymath). -export([fact/1]). fact(0) -> 1; fact(N) -> N * fact(N-1).
What we see here:
- module’s source code is stored in file with .erl extension
- module consists of attributes and function declarations which are terminated by period (.)
- we should provide module declaration defining name of the module
- module name should be atom
- module name is the same as file name minus .erl extension
- module declaration is mandatory
- module declaration attribute should be defined first.
To make functions defined in module accessible outside the module we need to export them, for this -export module attribute exists. We write exported functions inside square brackets in form of func/N where N is the number of arguments of function, called arity. I’ll repeat that functions not pointed in -export will not be accessible outside module.
Before code can be run, module must be compiled. Resulting compiled file will contain extension .beam
If you use Emacs you can compile module with C-c C-k and see results in erlang shell:
1> c(”/home/alienoid/dev/erlang/mymath”, [{outdir, "/home/alienoid/dev/erlang/"}]). {ok,mymath}
Or you can compile it directly in shell. Make sure your shell’s current directory is where your mymath.erl lives, if it’s not the case use cd command in erlang shell, cd(”/path/to/dir/with/mymath.erl”) :
1> c(mymath). {ok,mymath}
To invoke our function fact we use syntax mod:func :
2> mymath:fact(4). 24
Erlang has also -import attribute which allows to import functions into modules, so that you don’t need to use fully-qualified name mod:func to invoke function, again familiar behaviour and naming to Python programmer.
Erlang allows to insert code from file as-is with -include attribute at point where -import is defined, this is used to include records and macro definitions, for example.
Comments in Erlang module begin with character “%“, continue up to end-of-line and may be placed anywhere except inside string and quoted atoms.
Like in Python Erlang has no multiline comments.
If you use Emacs you can easily comment whole region with M-; command after you marked it.
-module(mymath). -export([fact/1, print_double/1]). -import(lists, [foreach/2]). -include(“my_records.hrl”). %% sum(L) -> %% sum(L, 0). %% sum([H|T], Acc) -> %% sum(T, H+Acc); %% sum([], Acc) -> Acc. fact(0) -> 1; fact(N) -> N * fact(N-1). print_double(L) -> foreach(fun(X) -> io:format(“Double of ~p = ~p~n”, [X, X*2]) end, L).
Fin.
Next tutorial will be devoted to thorough exploration of functions in Erlang.
September 17, 2007 at 4:13 am
Be careful with your examples. At the top, you’re trying to show comparison operators and your examples start with 1> and 2>, which at first glance make it look like “1 is greater than 1 equals 1″ which makes no sense. The REPL prompt is very misleading in this case.
== == equal 1> 1 == 1.
true
2> 1 == 1.0.
true
September 17, 2007 at 9:15 am
You are right, i should have highlighted erlang shell’s prompts in table to make it more understandable, it just turned out non trivial to make ASCII table in Emacs look acceptable in WordPress page. Attempts to hightlight “1>” and related breaks current table in bad way.
But thanks for feedback, i’ll take your remark into account.
September 17, 2007 at 9:12 pm
The “greater than or equal” sign for Python in your “operation comparison” chart should be >= .
Nice article, keep it up :)
September 17, 2007 at 9:46 pm
Thanks for noting typo and feedback, Alex. I’ve updated page to reflect the change.
September 18, 2007 at 12:44 am
Very nice. Eagerly awaiting future installments.
September 20, 2007 at 11:28 pm
[...] and comment-style In my previous post I mentioned that if you use Emacs and you’re editing Erlang source code you can easily [...]
October 1, 2007 at 3:13 pm
[...] tables in Emacs Sometimes I need to create tables in Emacs as it was in post describing comparison and arithmetic operations in Python and [...]