Size: a a a

2020 June 25

V

V in pro.elixir
Eugene
Друзья, день добрый!
Я "только учусь", так что помогите разобраться в основах.

Вот есть простой модуль, вычисляющий значение факториала.

defmodule factorial_01 do

 def factorial(n) when n > 1 do
   n * factorial(n - 1)
 end

 def factorial(n) when n <= 1 do
   1
 end
end

Не очень понятно — как это в одном модуле может одна и та же функиция определяться два раза?? Код вполне себе работает, но для человека знакомого только с имеперативными языками, выглядит странно.  Спасибо.
это называется параметрический полиморфизм
источник

E

Eugene in pro.elixir
можно ещё вопрос по поводу "иммутабельности" переменных?

n * factorial(n - 1)

После выполнения этой строки значение n (как ячейки в памяти) очень даже меняется. Не так прямолинейно, как в случае, например, n=n+1, но всё же меняется. Где здесь иммутабельность? Спасибо.
источник

V

V in pro.elixir
Eugene
можно ещё вопрос по поводу "иммутабельности" переменных?

n * factorial(n - 1)

После выполнения этой строки значение n (как ячейки в памяти) очень даже меняется. Не так прямолинейно, как в случае, например, n=n+1, но всё же меняется. Где здесь иммутабельность? Спасибо.
иммутабельность - это про то, что функции не изменяют свои аргументы
x = 1
something(x)
println x # всегда будет 1 независимо от того что делает something
источник

E

Eugene in pro.elixir
а если при вызове функции something() переменная x не указывается в качестве параметра, но при этом в теле функции она подвергается каким-то операциям — такое возможно?
источник

LL

Lama Lover in pro.elixir
Eugene
можно ещё вопрос по поводу "иммутабельности" переменных?

n * factorial(n - 1)

После выполнения этой строки значение n (как ячейки в памяти) очень даже меняется. Не так прямолинейно, как в случае, например, n=n+1, но всё же меняется. Где здесь иммутабельность? Спасибо.
n = n + 1 Это не значит изменить переменную, это значит что в контексте далее будет новый n
источник

LL

Lama Lover in pro.elixir
Eugene
а если при вызове функции something() переменная x не указывается в качестве параметра, но при этом в теле функции она подвергается каким-то операциям — такое возможно?
Это как?
источник

V

V in pro.elixir
Eugene
а если при вызове функции something() переменная x не указывается в качестве параметра, но при этом в теле функции она подвергается каким-то операциям — такое возможно?
что?
источник

E

Eugene in pro.elixir
ну типа функция видит переменную. как глобальную
источник

E

Eugene in pro.elixir
и меняет её
источник

V

V in pro.elixir
лексические замыкания что ли?
источник

LL

Lama Lover in pro.elixir
Тут нет глобальных переменных
источник

LL

Lama Lover in pro.elixir
В замыканиях переменные из внешнего контекста копируются внутрь
источник

E

Eugene in pro.elixir
ок, компилятор выдаст ошибку, так?
источник

V

V in pro.elixir
нет, если ты в замыкании делаешь присваивание - ты определяешь новую переменную внутри замыкания
источник

LL

Lama Lover in pro.elixir
Eugene
ок, компилятор выдаст ошибку, так?
Так ты попробуй сначала это напиши, посмотри как это работает
источник

LL

Lama Lover in pro.elixir
iex> x = 1
iex> f = fn -> x + 2 end
iex> f.(1)
3
iex> x = 2
iex> f.(1)
3

Вот
источник

LL

Lama Lover in pro.elixir
А глобальных переменных в языке нет
источник

V

V in pro.elixir
он имеет ввиду
x = 1
f = fn -> x = x + 2 end
f.(1)
x == ?
источник

E

Eugene in pro.elixir
но почему тогда работает
n * factorial(n - 1) ??

Оно не вынесено в отдельную функцию и поэтому работает, так?
источник

V

V in pro.elixir
что ты понимаешь под словом "работает"?
источник