 
       case derive do
         [] -> :ok
-        _  -> Protocol.__derive__(derive, __MODULE__, __ENV__)
+        _ -> Protocol.__derive__(derive, __MODULE__, __ENV__)
       end
 
       def __struct__() do


  # Called as ensure_evaled(list, {0, []}). Note acc is reversed.
  defp ensure_evaled(list, acc, expand) do
    :lists.mapfoldl(fn
      {:|, meta, [head, tail]}, acc ->
        {head, acc} = ensure_evaled_element(head, acc)
        {tail, acc} = ensure_evaled_tail(expand.(tail), acc, expand)
        {{:|, meta, [head, tail]}, acc}
      elem, acc ->
        ensure_evaled_element(elem, acc)
    end, acc, list)
  end

  defp ensure_evaled_element(elem, acc) when is_number(elem) or is_atom(elem) or is_binary(elem) do
    {elem, acc}
  end
  defp ensure_evaled_element(elem, acc) do
    ensure_evaled_var(elem, acc)
  end

  """
  defmacro raise(exception, attributes) do
    quote do
      :erlang.error(unquote(exception).exception(unquote(attributes)))
    end
  end

