view 5-Erlang/README.txt @ 93:39084e2b8744

Add a function for word-aware text wrapping Potentially hugely inefficient because we iterate through the string character by character, but then splitting it first and iterating over words still needs to iterate over the string to know where to split.
author IBBoard <dev@ibboard.co.uk>
date Tue, 18 Jun 2019 21:05:00 +0100
parents e05701354b6e
children
line wrap: on
line source

Install Erlang with "sudo zypper install erlang"

Erlang has a REPL (erl)

Comments are "%", just to be different

Commands need to end with a full-stop (like Prolog)

Erlang has dynamic typing with coercion: 2 + 2 = 4, 2 + 2.0 = 4.0
 → BUT lists aren't just lists, they're strings when the values are printable ASCII 😮
 → AND numbers aren't coerced to strings

As well as strings there are "atoms" - arbitrarily named symbols. 

Variables start with upper-case.

Variables can't be redefined. Trying results in "exception error: no match of right hand side value <the value>"

Lists use square brackets. Tuples use curly braces.

Tuples are apparently used instead of maps and hashes to associate atoms as keys with values.
 → Values are extracted from tuples using pattern matching
 → BUT this implies matching ordering (which isn't the same as maps)

Example:
    Person = {person, {name, "Agent Smith"}, {profession, "Killing programs"}}.
    % person, name and profession are atoms
    {person, {name, Name}, {profession, Profession}} = Person.
    Name. % prints "Agent Smith"
    Profession. % prints "Killing programs"

The initial atom is an Erlang-ism to make it easier to match all "person" tuples

Erlang can pack and unpack bits using "<<Variable:bit_count[ Variable:bit_count[, …]]>>" and then pattern matching to unpack

Functions are well documented at http://erlang.org/doc/apps/stdlib/index.html

Case statements use patern matching:

Animal = "dog".
case Animal of
    "dog" -> underdog;
    "cat" -> thundercat;
    _ -> something_else
end.

If statements use "guards" (conditions) and implies "elseif". Else requires a guard of "true".

if
    X > 0 -> positive;
    X < 0 -> negative;
    true -> zero
end.

Anonymous functions are defined as "fun(Var[, …]) -> [code] end."

List processing is in the "lists" module - e.g. lists:foreach/2 takes function and list of values and calls function on each value in list.
 → There are also map, filter, all and any functions, etc.
 → Interesting extra functions are lists:takewhile/2 and lists:dropwhile/2, which filter or discard from the start of a list based on the function's return

Erlang has list comprehension - similar to Python's, but with Erlang-y syntax.
 → [Function(Val) || Val <- List].   % Call Function on Val for each Val in List
 → Can also be done without a function and just code - e.g. [X * 2 || X <- [1, 2, 3]].
 → Therefore, map(Func,List) can be defined as [ Func(X) || X <- List ].
 → EXCEPT it isn't that simple - there can be multiple clauses after the double-pipe, which can be generators (X <- List) or filter clauses (X < 3)