docs: move not nil to the experimental page (#14027)

When I heard that this feature existed, and found the 2018 changelog entry that said `not nil` was made experimental (https://github.com/nim-lang/Nim/blob/devel/changelogs/changelog_0_19_0.md#changes-affecting-backwards-compatibility), I looked for `not nil` documentation in https://nim-lang.org/docs/manual_experimental.html. When I didn’t find it there, I initially assumed the feature had no documentation. This change moves the documentation to where readers will expect it.

As well as moving the text to another file, I added instructions for enabling the experimental feature and tweaked some wording.
This commit is contained in:
Rory O’Kane
2020-04-21 08:54:43 -04:00
committed by GitHub
parent 04c326569b
commit b8b0e9b21d
2 changed files with 30 additions and 26 deletions

View File

@@ -1851,32 +1851,6 @@ details like this when mixing garbage collected data with unmanaged memory.
.. XXX finalizers for traced objects
Not nil annotation
------------------
All types for which ``nil`` is a valid value can be annotated to
exclude ``nil`` as a valid value with the ``not nil`` annotation:
.. code-block:: nim
type
PObject = ref TObj not nil
TProc = (proc (x, y: int)) not nil
proc p(x: PObject) =
echo "not nil"
# compiler catches this:
p(nil)
# and also this:
var x: PObject
p(x)
The compiler ensures that every code path initializes variables which contain
non nilable pointers. The details of this analysis are still to be specified
here.
Procedural type
---------------
A procedural type is internally a pointer to a procedure. ``nil`` is

View File

@@ -340,6 +340,36 @@ This operator will be matched against assignments to missing fields.
a.b = c # becomes `.=`(a, b, c)
Not nil annotation
==================
**Note:** This is an experimental feature. It can be enabled with
``{.experimental: "notnil"}``.
All types for which ``nil`` is a valid value can be annotated with the ``not
nil`` annotation to exclude ``nil`` as a valid value:
.. code-block:: nim
{.experimental: "notnil"}
type
PObject = ref TObj not nil
TProc = (proc (x, y: int)) not nil
proc p(x: PObject) =
echo "not nil"
# compiler catches this:
p(nil)
# and also this:
var x: PObject
p(x)
The compiler ensures that every code path initializes variables which contain
non-nilable pointers. The details of this analysis are still to be specified
here.
Concepts
========