"спецификация имеет неправильную арность", замеченную при использовании предложения охраны для определения спецификации Эликсира

Вот код, к которому я пытаюсь добавить спецификацию.

@spec failure(term) :: error(term)
@spec failure(reason) :: error(reason) when reason: term
defmacro failure(reason) do
  quote do
    {:error, unquote(reason)}
  end
end

Первое определение спецификации работает отлично. Однако я хочу прояснить, что если причина является целым числом, то возвращаемая ошибка также будет содержать целое число. Вторая спецификация не работает. ошибка

Compiling 1 file (.ex)

== Compilation error in file lib/ok.ex ==
** (CompileError) lib/ok.ex:71: spec has wrong arity
    (stdlib) lists.erl:1338: :lists.foreach/2
    (stdlib) erl_eval.erl:677: :erl_eval.do_apply/6

1 ответ

Предоставленный вами код прекрасно работает с функциями (в отличие от макросов). Даже набор тестов Elixir для типов спецификаций имеет только тесты функций с защитой в спецификациях.

Я не могу сказать, если это еще не реализовано или это ошибка или что. Я полагаю, что вам лучше задать вопрос непосредственно в Elixir maillist и / или на форуме Elixir. Или же. может быть, стоит подать вопрос.

Другие вопросы по тегам