   in Elixir's constructs.
   """
 
+  defmacrop error!(args) do
+    quote do
+      _ = unquote(args)
+      message = "Elixir's special forms are expanded by the compiler and must not be invoked directly"
+      :erlang.error(RuntimeError.exception(message))
+    end
+  end
+
   @doc """
   Creates a tuple.
 

      #=> "This will"

  """
  defmacro cond(clauses), do: error! [clauses]

  @doc ~S"""
  Evaluates the given expressions and handle any error, exit

  In the environment you can access the current filename,
  line numbers, set up aliases, the current function and others.
  """
  defmacro __ENV__, do: error!([])

  @doc """
  Returns the current module name as an atom or `nil` otherwise.
