Size: a a a

2020 January 28

I

Igor Levin in pro.elixir
у тебя просто будет одновременно существовать две версии кода, но использоваться будет более старая
источник

I

Igor Levin in pro.elixir
но этот механизм как-то связан со способом вызова функции: либо M, f, a либо просто f, a
источник

SM

Sergei Maximov in pro.elixir
Igor Levin
но этот механизм как-то связан со способом вызова функции: либо M, f, a либо просто f, a
Вызовы M.f(a) идут на новую версию модуля, а f(a) — на текущую
источник

I

Igor Levin in pro.elixir
Sergei Maximov
Вызовы M.f(a) идут на новую версию модуля, а f(a) — на текущую
ты хочешь сказать, что приватная функция никогда не будет обновлена?
источник

PG

Pïg Grëënëst in pro.elixir
Разве f(a) вызовы возможны не только внутри модуля?
источник

SM

Sergei Maximov in pro.elixir
Igor Levin
ты хочешь сказать, что приватная функция никогда не будет обновлена?
Не обязательно "приватная", это remote vs local calls
источник

SM

Sergei Maximov in pro.elixir
источник

I

Igor Levin in pro.elixir
да я вот я ж туда и гляжу
источник

SM

Sergei Maximov in pro.elixir
источник

I

Igor Levin in pro.elixir
да, спасибо. ключевое, я б сказал, вот это:
A local call, an unqualified call to a function within the same module, is guaranteed to go to the same version of the code as the caller.
источник

SM

Sergei Maximov in pro.elixir
Igor Levin
ты хочешь сказать, что приватная функция никогда не будет обновлена?
Чтобы вызвать приватную функцию, надо сначала вызвать какую-нибудь публичную, т.е. всегда есть публичная точка входа. Если у тебя приватная функция просто возвращает какой-нибудь результат, то рано или поздно она выполнится, и следующий вызов будет уже у новой версии модуля (через публичную точку входа). А если у тебя какая-то приватная функция зациклена, то этот код будет выполняться, пока версию модуля не прибьёт в один прекрасный момент code server при загрузке третей версии кода ("If a third version of a module is loaded and there are still processes running (have pointers on the stack to) the code server will kill those processes and purge the old code").
источник

AB

Alexey Bolshakov in pro.elixir
а эликсир сам не преобразует вызов fa к mfa при компиляции? ну чтоб нам жить было проще
источник

PG

Pïg Grëënëst in pro.elixir
Из материалов выше должно было стать понятно, что это не сделает нашу жизнь легче
источник

SM

Sergei Maximov in pro.elixir
Sergei Maximov
Чтобы вызвать приватную функцию, надо сначала вызвать какую-нибудь публичную, т.е. всегда есть публичная точка входа. Если у тебя приватная функция просто возвращает какой-нибудь результат, то рано или поздно она выполнится, и следующий вызов будет уже у новой версии модуля (через публичную точку входа). А если у тебя какая-то приватная функция зациклена, то этот код будет выполняться, пока версию модуля не прибьёт в один прекрасный момент code server при загрузке третей версии кода ("If a third version of a module is loaded and there are still processes running (have pointers on the stack to) the code server will kill those processes and purge the old code").
Т.е. если вы будете писать свои долгоживующие процессы руками (через spawn и приватный луп), то скорее всего наткнётесь на ситуацию, когда у вас не обновляется версия модуля. Поэтому надо пользоваться OTP-поведениями (:gen_server и т.д.) либо :sys + :proc_lib, если процесс не подходит под какое-нибудь из существующих поведений (см. пример).
источник

SM

Sergei Maximov in pro.elixir
Alexey Bolshakov
а эликсир сам не преобразует вызов fa к mfa при компиляции? ну чтоб нам жить было проще
Так они же не эквивалентны с точки зрения виртуальной машины. Кроме того, remote calls не могут быть заинлайнены.
источник

VS

Viacheslav Shevchenko in pro.elixir
Igor Levin
у тебя просто будет одновременно существовать две версии кода, но использоваться будет более старая
Тут не согласен, будет использоваться новая.
источник

I

Igor Levin in pro.elixir
Viacheslav Shevchenko
Тут не согласен, будет использоваться новая.
соррян, писал в спешке, ты прав
источник

VS

Viacheslav Shevchenko in pro.elixir
перепроверил. ты прав
источник

ŹR

Źmićer Rubinštejn in pro.elixir
Нужно делать purge и ронять свои процессы до тех пор, пока ты не уверен что тебе этого не надо
источник

LL

Lama Lover in pro.elixir
Sergei Maximov
Т.е. если вы будете писать свои долгоживующие процессы руками (через spawn и приватный луп), то скорее всего наткнётесь на ситуацию, когда у вас не обновляется версия модуля. Поэтому надо пользоваться OTP-поведениями (:gen_server и т.д.) либо :sys + :proc_lib, если процесс не подходит под какое-нибудь из существующих поведений (см. пример).
Удваиваю
источник