Напишите, пожалуйста, что я молодец.
Мой транспилятор скажет что эти кейсы не сматчатся. А эликсировский компилятор ничего не скажет.
case %{1 => x} do
%{^x => 2} -> 2
end
case {%{x => 1}, %{2 => x}} do
{same, same} -> 2
end
К сожалению, этот матчинг мап это те самые 20% функционала, которые требуют 80% усилий, но с его завершением можно сказать, что мой транспилятор полностью способен предугатывать матчинг для выражений. Сейчас, кстати, мой транспилятор показывает примерно 20-40% ускорения для Pathex во всех случаях. В основном это всё получается от предподсчёта некоторых выражений, и инлайнинга fn-ов.
Например, в обычном Pathex вызов view(something, path(:x / :y / :z, :map)) раскроется в 2 вызова вложенных fn-ов. Но с использованием оптимизирующего транспилятора, это превратится просто в
case something do
%{x: %{y: %{z: x}} -> {:ok, x}
_ -> :error
end
Что есть максимально эффективный по памяти и времени код, который можно написать на Elixir для вытаскивания значений
Я хочу добавить ещё парочку маленьких оптимизаций, привести проект к нормальному виду, дедуплицировать кучу кода, написать кучу тестов и всего такого. И вот, когда я это сделаю, будет релиз, я перейду ко второй части, где буду строить Call Graph-ы, бэктрекинг переменных, DCE, инлайнинг и всё такое.
Мой транспилятор скажет что эти кейсы не сматчатся. А эликсировский компилятор ничего не скажет.
case %{1 => x} do
%{^x => 2} -> 2
end
case {%{x => 1}, %{2 => x}} do
{same, same} -> 2
end
К сожалению, этот матчинг мап это те самые 20% функционала, которые требуют 80% усилий, но с его завершением можно сказать, что мой транспилятор полностью способен предугатывать матчинг для выражений. Сейчас, кстати, мой транспилятор показывает примерно 20-40% ускорения для Pathex во всех случаях. В основном это всё получается от предподсчёта некоторых выражений, и инлайнинга fn-ов.
Например, в обычном Pathex вызов view(something, path(:x / :y / :z, :map)) раскроется в 2 вызова вложенных fn-ов. Но с использованием оптимизирующего транспилятора, это превратится просто в
case something do
%{x: %{y: %{z: x}} -> {:ok, x}
_ -> :error
end
Что есть максимально эффективный по памяти и времени код, который можно написать на Elixir для вытаскивания значений
Я хочу добавить ещё парочку маленьких оптимизаций, привести проект к нормальному виду, дедуплицировать кучу кода, написать кучу тестов и всего такого. И вот, когда я это сделаю, будет релиз, я перейду ко второй части, где буду строить Call Graph-ы, бэктрекинг переменных, DCE, инлайнинг и всё такое.