Size: a a a

2021 March 03

SK

Simon Khaskelberg in pro.elixir
Lama Lover
Ну, ты можешь что-то типа
import IEx.Helpers, except: [recompile: 0]

defmodule MyHelpers do
 def recompile() do
   IEx.Helpers.recompile()
   IO.puts "hehe"
 end
end

import MyHelpers
Это не сработает. Не даст импортнуть модуль
источник

AB

Alex Bubnov in pro.elixir
но я не оч понимаю пока, куда вызов этой штуки класть
источник

AB

Alex Bubnov in pro.elixir
Simon Khaskelberg
Это не сработает. Не даст импортнуть модуль
это детали, тут сломается импорт, но можно однобуквенный алиас
источник

AB

Alex Bubnov in pro.elixir
восхитительно.
1 - оно одноразовое!
2 - я пока не понял, почему оно не триггерится при recompile
источник

AB

Alex Bubnov in pro.elixir
Alex Bubnov
короче, это идея собирать список имплементаций протокола, собирать с них диспатч-таблицу и класть ее в persistent_term. schema registry, можно сказать.
но, это спотыкается об мой же воркфлоу, где много тестов в репле, хочется обновлять эту фигню при рекомпиляции
хорошо, зайдем с другой стороны - вот такое кто-нибудь делал?
источник

AD

Anastasiya Dyachenko in pro.elixir
Alex Bubnov
хорошо, зайдем с другой стороны - вот такое кто-нибудь делал?
а в чем идея?
источник

AD

Anastasiya Dyachenko in pro.elixir
ну т.е. почему в рантайме не дергать например Protocol.extract_impls
источник

AB

Alex Bubnov in pro.elixir
Anastasiya Dyachenko
а в чем идея?
протокол сериализации с тегами.
типа, %S{} -> %{__tag__: "#{S}", ...} обеспечивается самим протоколом, и отсутствие необходимости руками поддерживать таблицу tag -> (%{} -> %S{})
источник

AB

Alex Bubnov in pro.elixir
Anastasiya Dyachenko
ну т.е. почему в рантайме не дергать например Protocol.extract_impls
упаси боже, он же на диск ходит
(хотя это проверить надо, конечно)
источник

AD

Anastasiya Dyachenko in pro.elixir
все равно не понимаю зачем нужна таблица, там какие-то разные протоколы делают сериализацию?
источник

AD

Anastasiya Dyachenko in pro.elixir
если протокол один то что тогда проверять по этой таблице, имплементацию пишешь и все
источник

AB

Alex Bubnov in pro.elixir
Anastasiya Dyachenko
все равно не понимаю зачем нужна таблица, там какие-то разные протоколы делают сериализацию?
таблица нужна на десериализации, когда на входе только мапа с тегом.
типа, я пишу такой gen_server, который умеет персиститься в базу и мигрировать между нодами.
у него есть топлевел стейт самого интерпретатора, у него внутри сабстейт пользовательского кода, и код десериализации в GS не знает во что этот сабстейт десериализовывать.
источник

AB

Alex Bubnov in pro.elixir
можно прибиться к модулю пользовательского кода, да.
источник

AD

Anastasiya Dyachenko in pro.elixir
я опять не в тему, но мне в голову приходит сделать такое:

defimpl A, for: Map do
 def parse(%{__tag__: smth}) do
    struct(???)
 end
 
 def parse (%{} = map), do: map
end
источник

ŹR

Źmićer Rubinštejn in pro.elixir
@nwalker А почему тебе не нравится идея explicit это все указывать?
источник

AB

Alex Bubnov in pro.elixir
Źmićer Rubinštejn
@nwalker А почему тебе не нравится идея explicit это все указывать?
не забывать поддерживать надо.
источник

ŹR

Źmićer Rubinštejn in pro.elixir
Ну так explicit better then implicit же
источник

ŹR

Źmićer Rubinštejn in pro.elixir
Иначе получится рельса
источник

AB

Alex Bubnov in pro.elixir
ну и у меня есть некоторые травмы от explicit реализаций подобных вещей
источник

AB

Alex Bubnov in pro.elixir
Źmićer Rubinštejn
Иначе получится рельса
нормально подъебал)
источник