В рамках программы изучения Erlang я делаю упражнения из книги «Erlang programming» Франческо Чезарини и Саймона Томпсона. Оказалось что это на редкость полезное занятие, – теперь синтаксис не кажется таким уж страшным, и решение хоть и простых, но практических задач, придает уверенности в себе. Ниже я приведу условия задачи (уж простите, без перевода) и свой вариант решения (зачастую не оптимальный).

## Exercise 3-1: Evaluating Expressions

Write a function sum/1which, given a positive integer N, will return the sum of all the integers between 1 and N.

*Example: sum(5) ⇒ 15.*

Write a function sum/2which, given two integers N and M, where N =< M, will return
the sum of the interval between N and M. If N > M, you want your process to terminate

abnormally.

*Example:*

*sum(1,3) ⇒ 6.*

*sum(6,6) ⇒ 6.*

-module(test3_1). -export([start/0]). -import(io). -import(lists). listCreate(L, Start, End) -> if Start < End -> listCreate(L ++ [End], Start, End - 1); true -> L end. sum(N) -> %Res = listCreate([], 0, N), %io:format("~w~n", [Res]), lists:sum(listCreate([], 0, N)). sum(Start, End) -> lists:sum(listCreate([], Start, End)). start() -> io:format("~w~n~w~n", [sum(5), sum(1,3)]).

## Exercise 3-2: Creating Lists

Write a function that returns a list of the format [1,2,..,N-1,N].

*Example:*

*create(3) ⇒ [1,2,3].*

Write a function that returns a list of the format [N, N-1,..,2,1].

*Example:*

*reverse_create(3) ⇒ [3,2,1].*

-module(test3_2). -export([start/0]). create(List, 0) -> List; create(List, N) -> create(List ++ [N], N - 1). create(N) -> create([], N). start() -> create(3).

## Exercise 3-3: Side Effects

Write a function that prints out the integers between 1 and N.

Hint: use io:format(“Number:~p~n”,[N]).

Write a function that prints out the even integers between 1 and N.

Hint: use guards.

-module (test3_3). -import (io). -export ([start/0]). % implementation with if print(Max, Cur) -> NewCur = Cur + 1, if Max > Cur -> io:format("Number:~p~n",[NewCur]), print(Max, NewCur); true -> io:format("Number:~p~n",[NewCur]) end. print(Max) -> print(Max - 1, 0). % implementation with guard print1(Max, Min) when Max > Min -> NewCur = Min + 1, io:format("Number:~p~n",[NewCur]), print1(Max, NewCur); print1(_, _) -> false. print1(Max) -> print1(Max, 0). start() -> % print(3). print1(3).