Size: a a a

2020 June 25

E

Eugene in pro.elixir
хорошо, я примерно теперь это понимаю так: никакой иммутабельности в чистом виде нет. Есть просто запрет на изменение параметра функции за пределами тела этой самой функции, так?
источник

LL

Lama Lover in pro.elixir
n = n + 1

На самом деле выглядит типа
print(pointer(context["n"])) # prints 0x0011
context["n"] = create_new_variablе(context["n"] + 1)
print(pointer(context["n"])) # prints 0x0022
источник

V

V in pro.elixir
Eugene
> а новое_n просто имеет в данном контексте то же имя, что и старое

Тогда где здесь иммутабельность??
источник

LL

Lama Lover in pro.elixir
Eugene
хорошо, я примерно теперь это понимаю так: никакой иммутабельности в чистом виде нет. Есть просто запрет на изменение параметра функции за пределами тела этой самой функции, так?
Нет, это и есть иммутабельность переменных. Если ты имеешь указатель на переменную, то значение по этому указателю никак нельзя изменить. Можно только создать новую, изменённую, с новым указателем
источник

E

Eugene in pro.elixir
как это?? Как может быть копия переменной с таким же именем??
источник

LL

Lama Lover in pro.elixir
Lama Lover
n = n + 1

На самом деле выглядит типа
print(pointer(context["n"])) # prints 0x0011
context["n"] = create_new_variablе(context["n"] + 1)
print(pointer(context["n"])) # prints 0x0022
Я же тебе псевдокод написал
источник

E

Eugene in pro.elixir
ладно, большое спасибо, пойду ждать просветления...
источник

V

V in pro.elixir
Eugene
хорошо, я примерно теперь это понимаю так: никакой иммутабельности в чистом виде нет. Есть просто запрет на изменение параметра функции за пределами тела этой самой функции, так?
Во-первых не жонглируй словами - "нет никакой иммутабельности", "есть никакой иммутабельности" - тебя это к просветлению не приблизит.
Во-вторых, запрет не на изменение ЗА ПРЕДЕЛАМИ функции, а как раз наоборот - запрет на изменение В ПРЕДЕЛАХ функции.
В-третьих в чём суть проблемы? В некоторых многих языках можно сделать так
x = 1
something(x)
x == ??? # тут ты совершенно не знаешь, чему равно x, может быть 1, а может быть 42 или 100500
т.е. в некоторых многих языках функции могут мутировать свои аргументы. И это есть проблема как минимум когнитивная - сложнее читать код. Иммутабельность - это про гарантию того, что после вызова функции аргумент останется таким же каким был до вызова.
источник

E

Eugene in pro.elixir
ок, я кажется, начал понимать где я "торможу"
источник

М

Максим in pro.elixir
Тут немного не та иммутабельность. Как уже писали выше та самая иммутабельность есть в эрланге, там если ты привязал значение к имени, то в течении всего контекста это имя будет ссылаться на одни и те же данные. В эликсире эту фичу решили похерить, и дать возможность затирать ссылку на старые данные. Но тем не менее, там где ссылка на эти данные уже есть (замыкание контекста в анонимных функциях как пример) данные так и останутся теми старыми, до перезаписи ссылки
источник

V

V in pro.elixir
Вот смотри
plusOne = fn (x) -> x + 1 end
x = 1
IO.puts x # ==> 1
plusOne.(x)
IO.puts x # ==> 1
x = plusOne.(x)
IO.puts x # ==> 2
источник

E

Eugene in pro.elixir
спасибо за подробные ответы, но мне, видимо, такое ещё рано. Что-то во мне глубоко императивное сидит...
источник

E

Eugene in pro.elixir
😢
источник

М

Максим in pro.elixir
Начни с эрланга, там этот момент раскрыт намного лучше, в эликсире просто навернули немного сахара на эту вещь
источник

V

V in pro.elixir
Eugene
спасибо за подробные ответы, но мне, видимо, такое ещё рано. Что-то во мне глубоко императивное сидит...
источник

E

Eugene in pro.elixir
друзья, я вынужден высокопарно заметить, что кодить — это не картошку копать. Непонимание базовых вещей приводит к тому, что компилятор находит ошибки ровно в каждой первой строчке! По крайней мере, у меня так.
источник

V

V in pro.elixir
Мсье хочет научиться программировать по советам в чате?
источник

E

Eugene in pro.elixir
критика справедливая, я умолкаю.
источник

V

V in pro.elixir
источник

М

Максим in pro.elixir
Ну и самый момент. Переменные в эрланге и эликсире они не такие как привычном мире. Это реально ссылки на данные. А эти данные создаются единожды и более никогда не меняются (возможны исключения, но для этого надо черный пояс получить). Вот настоящая иммутабельность она там. Т.е. когда ты отдаешь куда то ссылку на данные, то ты стопроцентно можешь быть уверен, что они дойдут до нужного места в том виде, в котором были отданы. При попытке изменения этих данных происходит то, что в обычном мире называется copy-on-write, т.е. создаются новые данные и уже они связываются с новой ссылкой.
источник