Size: a a a

2021 March 03

ع

عاصم بن حارث... in pro.elixir
Źmićer Rubinštejn
Иначе получится рельса
😂👍
источник

AB

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

defimpl A, for: Map do
 def parse(%{__tag__: smth}) do
    struct(???)
 end
 
 def parse (%{} = map), do: map
end
да, это в общем оно.
упрощая, вопрос в том, откуда брать аргумент для struct.
на деле там конечно еще добавление runtime-only полей, апгрейды старых версий, etc.
источник

AD

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

AD

Anastasiya Dyachenko in pro.elixir
или проблема с тем чтобы распарсить тег
источник

AB

Alex Bubnov in pro.elixir
Anastasiya Dyachenko
ну ты выше вроде писал что из тег и берется, не?
да, и в тег вообще можно просто атом модуля структуры положить, но хочется дополнительный indirection, чтобы в случае чего код рефакторить нормально.
на этом моменте возникает табличка tag -> module. вообще, ее легко собрать с consolidated протокола, и положить в кэш, чтобы не делать лишних телодвижений.

вопрос начался с того, как этот кэш в режиме разработки обновлять.
источник

AB

Alex Bubnov in pro.elixir
вообще, https://hexdocs.pm/mix/Mix.Task.Compiler.html#after_compiler/2 удивительная функция.
про нее в интернетах есть три упоминания - анонс elixir 1.10, дока, и проект telemetria на гитхабе, и ни одно из них не описывает, в общем, в каких условиях она может не работать
источник

LL

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

Если количество этих структур определено протоколом и конечно, то просто генерируй кейсы для функции декодирования в компайле

Если количество этих структур динамическое, то тогда что ты будешь делать когда при десериализации ты распакуешь несуществующую структуру?
источник

AB

Alex Bubnov in pro.elixir
Lama Lover
Я правильно понял, что ты хочешь сериализовать структуры в данные так, чтобы при десериализации данные распаковывались обратно в те же структуры?

Если количество этих структур определено протоколом и конечно, то просто генерируй кейсы для функции декодирования в компайле

Если количество этих структур динамическое, то тогда что ты будешь делать когда при десериализации ты распакуешь несуществующую структуру?
количество таких структур в скомпилированной версии статично.

хотелось, чтобы количество структур определялось протоколом, да, но не уверен, что реализации протокола можно перечислить в компайл-тайме - по-моему, консолидация идет уже после всей компиляции.
источник

ML

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

AB

Alex Bubnov in pro.elixir
Maksim Lapshin
вот как с asn
может быть, да.
я припоминаю, вы что-то упоминали про словари тэгов, определяющих как десериализовывать поле сообщения.
источник

LL

Lama Lover in pro.elixir
Alex Bubnov
количество таких структур в скомпилированной версии статично.

хотелось, чтобы количество структур определялось протоколом, да, но не уверен, что реализации протокола можно перечислить в компайл-тайме - по-моему, консолидация идет уже после всей компиляции.
Так и причём тут консолидация, пусть модули со структурами явно у себя вызывают какой-нибудь макрос, который посылает имплементацию в какой-нибудь процесс, который дожидается конца компиляции и потом генерирует код в __before_compile__ твоего модуля-десериализатора
источник

AB

Alex Bubnov in pro.elixir
Lama Lover
Так и причём тут консолидация, пусть модули со структурами явно у себя вызывают какой-нибудь макрос, который посылает имплементацию в какой-нибудь процесс, который дожидается конца компиляции и потом генерирует код в __before_compile__ твоего модуля-десериализатора
ужс
источник

AB

Alex Bubnov in pro.elixir
то есть, да, наверное можно и так
источник

AB

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

AB

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

LL

Lama Lover in pro.elixir
Alex Bubnov
но ведь есть консолидация протоколов, которая фактически делает то же самое уже
Так и ты хочешь какую-то странную вещь
Чтобы на этапе компиляции знать объекты, которые нужно десериализовывать в структуры

Обычно просто пишут свой компилятор, который вызывается после (или перед) эликсировским и парсит файлы с определениями объектов
Определать объекты в коде, да ещё и на elixir-е как-то странно. Лучше делать просто use MyProto, schema: "path/to/file.schema"
источник

AB

Alex Bubnov in pro.elixir
Lama Lover
Так и ты хочешь какую-то странную вещь
Чтобы на этапе компиляции знать объекты, которые нужно десериализовывать в структуры

Обычно просто пишут свой компилятор, который вызывается после (или перед) эликсировским и парсит файлы с определениями объектов
Определать объекты в коде, да ещё и на elixir-е как-то странно. Лучше делать просто use MyProto, schema: "path/to/file.schema"
не-не, я не хочу их знать на этапе компиляции, я хочу их знать в рантайме, и узнать их в рантайме просто(из консолидированного протокола).
источник

LL

Lama Lover in pro.elixir
Alex Bubnov
не-не, я не хочу их знать на этапе компиляции, я хочу их знать в рантайме, и узнать их в рантайме просто(из консолидированного протокола).
Но это же объекты протокола взаимодействия, а такие протоколы в рантайме не меняются
Поэтому ты их знаешь уже в компайле
источник

LL

Lama Lover in pro.elixir
И поэтому они должны явно присутствовать в скомпилированной программе
Всё остальное можно оставить интерпретируемым языкам
источник

LL

Lama Lover in pro.elixir
Лучше всего, конечно, знать все эти объекты не в компайле, а ещё до написания кода, чтобы явно описать их сереализацию и десереализацию
источник