Создать новую оговорку о защите

В Elixir, как я могу создать новое предложение охраны для функции? Очевидно, я видел, что вы не можете просто вызвать какую-либо функцию в инструкции when, но было бы неплохо сделать что-то вроде этого:

defmodule Player do
  def play_card(player), do: []
  def play_card(player) when has_cards(player), do: ...
  # Define has_cards as guard clause?
end

Ответы

Ответ 1

Короткий ответ: вы не можете.

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

Список действительных охранников можно найти в руководстве по началу работы: http://elixir-lang.org/getting-started/case-cond-and-if.html#expressions-in-guard-clauses

Пример реализации "сложного" защитного макроса можно найти в источнике Elixir: https://github.com/elixir-lang/elixir/blob/5d34fcdccd20bf38c4f2a13f8adeb78e22b4e74c/lib/elixir/lib/kernel.ex#L1574