********
Pragmas
********

.. role:: idris(code)
    :language: idris

Idris2 supports a number of pragmas (identifiable by the `%` prefix). Some pragmas change compiler behavior
until the behavior is changed back using the same pragma while others apply to the following declaration. A
small niche of pragmas apply directly to one or more arguments instead of the code following the pragma
(like the `%name` pragma described below).

.. note::
    This page is a work in progress. If you know about a pragma that is not described yet, please consider
    submitting a pull request!


``%builtin``
====================

The ``%builtin Natural`` pragma converts recursive/unary representations of natural numbers
into primitive ``Integer`` representations.

This pragma is explained in detail on its own page. For more, see :ref:`builtins`.

``%deprecate``
====================

Mark the following definition as deprecated. Whenever the function is used, Idris will show a deprecation
warning.

.. code-block:: idris

   %deprecate
   foo : String -> String
   foo x = x ++ "!"

   bar : String
   bar = foo "hello"

.. code-block:: none

   Warning: Deprecation warning: Man.foo is deprecated and will be removed in a future version.

You can use code documentation (triple vertical bar `||| docs`) to suggest a strategy for removing the
deprecated function call and that documentation will be displayed alongside the warning.

.. code-block:: idris

   ||| Please use the @altFoo@ function from now on.
   %deprecate
   foo : String -> String
   foo x = x ++ "!"

   bar : String
   bar = foo "hello"

.. code-block:: none

   Warning: Deprecation warning: Man.foo is deprecated and will be removed in a future version.
     Please use the @altFoo@ function from now on.

``%inline``
====================

Instruct the compiler to inline the following definition when it is applied. It is generally best to let the
compiler and the backend you are using optimize code based on its predetermined rules, but if you want to
force a function to be inlined when it is called, this pragma will force it.

.. code-block:: idris

   %inline
   foo : String -> String
   foo x = x ++ "!"

``%noinline``
====================

Instruct the compiler _not_ to inline the following definition when it is applied. It is generally best to let the
compiler and the backend you are using optimize code based on its predetermined rules, but if you want to
force a function to never be inlined when it is called, this pragma will force it.

.. code-block:: idris

   %noinline
   foo : String -> String
   foo x = x ++ "!"

``%name``
====================

Give the compiler some suggested names to use for a particular type when it is asked to generate names for values.
You can specify any number of suggested names; they will be used in-order when more than one is needed for a single
definition.

.. code-block:: idris

   data Foo = X | Y

   %name Foo foo,bar

