Size: a a a

2021 April 30

V

V in pro.elixir
семантически выражение такое:
"если b - непустой список, то a = b, иначе a = c"
источник

AD

Anastasiya Dyachenko in pro.elixir
это map lookup а не сранивание
источник

V

V in pro.elixir
матчинг с [_ | _] наиболее близок к этому вербальному описанию
источник

V

V in pro.elixir
втаскивание всяких nil, [] и прочего усложняет чтение
источник

AD

Anastasiya Dyachenko in pro.elixir
ну так ты задачу изначально поставил как nil или [], вот и недопонимание
источник

AD

Anastasiya Dyachenko in pro.elixir
тогда правильнее всего будет использовать is_list(a) and a != []
источник

LL

Lama Lover in pro.elixir
defmodule X do

 def cmp(list) do
   Enum.filter(list, fn x ->
     if x == [], do: true, else: false
   end)
 end

 def pm(list) do
   Enum.filter(list, & match?([], &1))
 end

end

n = 10_000

list =
 [[]]
 |> Stream.cycle()
 |> Enum.take(n)
 |> Enum.zip(1..n)
 |> Enum.flat_map(fn {a, b} -> [a, b] end)

Benchee.run(%{
 "pm" => fn ->
   X.pm(list)
 end,
 "cmp" => fn ->
   X.cmp(list)
 end
})


Name           ips        average  deviation         median         99th %
pm          1.97 K      508.00 μs    ±10.35%      488.60 μs      679.60 μs
cmp         1.60 K      626.34 μs    ±11.92%      606.18 μs     1151.46 μs

Comparison:
pm          1.97 K
cmp         1.60 K - 1.23x slower +118.34 μs
источник

V

V in pro.elixir
но нам нежелательно каждый раз видеть эту проверку на is_list, это бойлерплейт :)
у нас по логике в данном месте b - это список, вопрос только пустой или нет
источник

AD

Anastasiya Dyachenko in pro.elixir
a != [] ? к чему тогда все эти :aaa :bbb
источник

V

V in pro.elixir
к тому что это опять натягивание совы на глобус
источник

V

V in pro.elixir
это сравнение с негативным (исключаемым) образцом, а правильный тест - на сравнение со включаемым образцом
источник

AD

Anastasiya Dyachenko in pro.elixir
match? [] это сравнение с исключаемым образцом
источник

LL

Lama Lover in pro.elixir
Если убрать if x == [], do: true, else: false и оставить x == []
Результат вот такой
Name           ips        average  deviation         median         99th %
pm          1.97 K      508.16 μs    ±10.02%      492.75 μs      693.95 μs
cmp         1.57 K      637.88 μs    ±15.06%      608.31 μs     1172.37 μs

Comparison:
pm          1.97 K
cmp         1.57 K - 1.26x slower +129.72 μs
источник

V

V in pro.elixir
то есть вместо if match(correct_case) ты пытаешься сделать if not match(incorrect_case1, incorrect_case2, ...) a это смена семантики, потому что множество всех вариантов значений слишком велико чтобы покрыть их негативными кейсами
источник

AD

Anastasiya Dyachenko in pro.elixir
ок спасибо, интересно
источник

AB

Alex Bubnov in pro.elixir
а если is_list?
источник

LL

Lama Lover in pro.elixir
Я все эти наносекунды знаю не потому что я зануда, а я уже давно хожу вокруг да около оптимизирующего компилятора (точнее, шага компиляции), для эликсира
источник

AD

Anastasiya Dyachenko in pro.elixir
ето бойлерплейт
источник

V

V in pro.elixir
match?([_ | _], ...) же
источник

ММ

Максим Мартынов... in pro.elixir
в OTP 24 завезут JIT
источник