Size: a a a

2020 November 09

DR

Dmitry Russ (Aleksan... in pro.elixir
V
А если я возьму твой проект и сделаю mix deps.get - у меня твои изменения в deps/lens/lib/lens.ex будут присутствовать?
У нас другая фигня с риаком и другими зависимостями решалась таким образом.
источник

LL

Lama Lover in pro.elixir
V
А если я возьму твой проект и сделаю mix deps.get - у меня твои изменения в deps/lens/lib/lens.ex будут присутствовать?
Нет, если бы я хотел сделать это на mix deps.get, написал бы алиас, который вызывает скрипт.

В моём случае в этом нет смысла
источник

DR

Dmitry Russ (Aleksan... in pro.elixir
Сейчас я бы добавил даже отдельный таск и алиас без мейкфайла. Что-то типа 'mix deps.init' и отдельный таск mix deps.patch, который делает патч и всех косяков, которые встречаются.
источник

V

V in pro.elixir
Lama Lover
Статического анализа недостаточно
Опять же, ты либо даёшь гарантии что модули не будут пересекаться, либо не даёшь. Конец
В данном случае гарантиям не обязательно быть абсолютными. Гарантии на статические модули уже очень хорошо. Тебе бы с твоей ситуацией помогли.
источник

ŹR

Źmićer Rubinštejn in pro.elixir
Короче говоря архивы и протоколы не совместимы
источник

DF

Denis Fakhrtdinov in pro.elixir
Протоколы это же просто интерфейсы, покрытые слоем шоколада.
источник

DF

Denis Fakhrtdinov in pro.elixir
behavior по сути.
источник

LL

Lama Lover in pro.elixir
V
В данном случае гарантиям не обязательно быть абсолютными. Гарантии на статические модули уже очень хорошо. Тебе бы с твоей ситуацией помогли.
Как помогли? Ну вот у создателя Focus высветился бы ворнинг что у него модули не под общим Focus., он бы всё равно запушил

Да и потом, много где модули находятся не под общим модулем. Взять, например, тот же GenStage, где и ConsumerSupervisor есть.
источник

ŹR

Źmićer Rubinštejn in pro.elixir
Denis Fakhrtdinov
Протоколы это же просто интерфейсы, покрытые слоем шоколада.
Вообще не так
источник

DF

Denis Fakhrtdinov in pro.elixir
А в чем разница?
источник

DF

Denis Fakhrtdinov in pro.elixir
Положим, мне нужно чтобы мой модуль/стракт умел в Enum.member. Я реализую функцию, в компайл-тайме это кладется в мету, из которой в рантайме будет известно какую функцию дергать как коллбек для вызова member.
источник

ŹR

Źmićer Rubinštejn in pro.elixir
Behavior это разное поведение на одних и тех же данных. Протокол соответственно наоборот
источник

DF

Denis Fakhrtdinov in pro.elixir
С чего бы? Behavior — это просто список функций, который должен быть реализован. Никаких требований к данным там нет.
источник

DF

Denis Fakhrtdinov in pro.elixir
Так же как и в протоколах ты можешь из size возвращать строку.
источник

LL

Lama Lover in pro.elixir
Denis Fakhrtdinov
С чего бы? Behavior — это просто список функций, который должен быть реализован. Никаких требований к данным там нет.
Да, но Behaviour определяется модулем, тогда как протоколы определяются в зависимости от данных.

Можно конечно сказать, что если у нас есть %MyModule{}, и модуль MyModule реализует некоторое поведение, то ты можем вызывать его как
defmodule MyProtocol do
 def size(%module{} = structure) do
   module.size(structure)
 end
end


но это будет неэффективно, потому что это считай как apply
Протоколы делают это эффективнее через консолидацию
Consolidation directly links protocols to their implementations in a way that invoking a function from a consolidated protocol is equivalent to invoking two remote functions.
источник

DF

Denis Fakhrtdinov in pro.elixir
Apply не настолько большой оверхед даёт :)
источник

DF

Denis Fakhrtdinov in pro.elixir
Но да, если у тебя модуль лежит в структуре данных, это и есть behavior, спрятанный за тремя покрывалами.
источник

DF

Denis Fakhrtdinov in pro.elixir
Разве нет?
источник

LL

Lama Lover in pro.elixir
Denis Fakhrtdinov
Apply не настолько большой оверхед даёт :)
Да, это правда, но всё-таки разница в несколько раз
apply это в 6 раз дольше чем вызов локальной функции, когда в консолидированном протоколе это всего лишь в 2 раза дольше
источник

AB

Alex Bubnov in pro.elixir
Denis Fakhrtdinov
Но да, если у тебя модуль лежит в структуре данных, это и есть behavior, спрятанный за тремя покрывалами.
имплементация протокола не обязана лежать рядом со структурой или рядом с протоколом
источник