Size: a a a

2018 November 09

DR

Dmitry Russ (Aleksandrov) in pro.elixir
Это лимитация из Erlang-а.
источник

Е

Евгений in pro.elixir
Да в общем-то вопрос был скорее академический, чем практический. Я стараюсь избегать длинных и сложных паттерн-матчингов в параметрах функции
источник

DR

Dmitry Russ (Aleksandrov) in pro.elixir
Там оно работает по-другому - и Elixir с этим ничего сделать уже не может.
источник

DR

Dmitry Russ (Aleksandrov) in pro.elixir
```
key = :test
fn(key, %{^key => value}) ->
```
источник

DR

Dmitry Russ (Aleksandrov) in pro.elixir
Он берёт ключ извне.
источник

Е

Евгений in pro.elixir
а ну если это лямбда, то наверное прокатит
источник

Е

Евгений in pro.elixir
но я не проверял
источник

DR

Dmitry Russ (Aleksandrov) in pro.elixir
key = :test
fn(key, %{^key => value}) -> value end

iex(4)> v.(:foo, %{test: 1})
1
источник

Е

Евгений in pro.elixir
но получится не то что ожидется :)
источник

Е

Евгений in pro.elixir
говнокодно :)
источник

DR

Dmitry Russ (Aleksandrov) in pro.elixir
Да, и Elixir даже если бы хотел бы, то ничего не может сделать с этим.
источник

Е

Евгений in pro.elixir
ну он может эмулировать, но это не нужно
источник

Е

Евгений in pro.elixir
паттерн-матчинг, что прямо заложен в байт-код BEAM?
источник

DR

Dmitry Russ (Aleksandrov) in pro.elixir
Евгений
паттерн-матчинг, что прямо заложен в байт-код BEAM?
Семантика того, что можно делать в паттерн-матчинге заложена. Т.е. если паттерн мэтчинг в head-функции не поддерживает динамические ключи, то ничего с этим не сделать.
источник

DR

Dmitry Russ (Aleksandrov) in pro.elixir
Точно так же нельзя писать и when my_function(...) - не поддерживается. И у того и другого есть технические причины, почему сделано именно так.
источник

DR

Dmitry Russ (Aleksandrov) in pro.elixir
А вот с этим ещё хуже: fn(key, %{^key := value}) - оно помимо этого уже работает и семантически по-другому.
источник

DR

Dmitry Russ (Aleksandrov) in pro.elixir
Интересно, что с guard-ами можно вот так проверить, есть ли ключ (но не сразу получить его):

  def test(map, key) when :erlang.is_map_key(key, map), do: {:ok, :erlang.map_get(key, map)}
 def test(_, _), do: {:error, :not_found}
источник

DR

Dmitry Russ (Aleksandrov) in pro.elixir
Евгений
ну он может эмулировать, но это не нужно
Кстати, есть дискуссии по поводу того, стоит ли добавить

Yes, we should. There are things that can’t be expressed with the other proposals (or any other way in a guard for that matter), most notably:

def check_key(map, key) when is_list(map_get(map, key)), do: ...
It’s effectively implementing the def foo(key, %{key => value}) ... that is such a frequent request - now we’d have a way to do this.


https://elixirforum.com/t/discussion-incorporating-erlang-otp-21-map-guards-in-elixir/14816/7 https://github.com/elixir-lang/elixir/issues/6611
источник

DR

Dmitry Russ (Aleksandrov) in pro.elixir
По сути - всё равно будет небольшая эмуляция, потому что def foo(key, %{key => value}) => нельзя сделать через новые guard-ы, а соответственно требует всё равно какой-нибудь эмуляции.
источник

DR

Dmitry Russ (Aleksandrov) in pro.elixir
Это всё равно актуально для Elixir-а будет только через год.
источник