         defstruct name: nil, age: nil
       end
 
-  Struct fields are evaluated at definition time, which allows
-  them to be dynamic. In the example below, `10 + 11` will be
-  evaluated at compilation time and the age field will be stored
+  Struct fields are evaluated at compile-time, which allows
+  them to be dynamic. In the example below, `10 + 11` is
+  evaluated at compile-time and the age field is stored
   with value `21`:
 
       defmodule User do

  ## Deriving

  Although structs are maps, by default structs do not implement
  any of the protocols implemented for maps. For example, if you
  attempt to use the access protocol with the User struct, it
  will lead to an error:

      %User{}[:age]
      ** (Protocol.UndefinedError) protocol Access not implemented for %User{...}

  However, `defstruct/1` allows implementation for protocols to
  derived by defining a `@derive` attribute as a list before `defstruct/1`
  is invoked:

      defmodule User do
        @derive [Access]

        defp sum(a, b), do: a + b
      end

      Foo.bar #=> 3
      Foo.sum(1, 2) #=> ** (UndefinedFunctionError) undefined function: Foo.sum/2

  """
  defmacro defp(call, expr \\ nil) do
    define(:defp, call, expr, __CALLER__)
  end

  @doc """
  Defines a macro with the given name and body.

  ## Examples

