Skip to content

Commit

Permalink
document type bound operators (nim-lang#17063)
Browse files Browse the repository at this point in the history
* document type bound rountines
* address comments
* Update doc/manual.rst

Co-authored-by: Andreas Rumpf <rumpf_a@web.de>
  • Loading branch information
2 people authored and ardek66 committed Mar 26, 2021
1 parent 67a570c commit f09bf1f
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 2 deletions.
5 changes: 3 additions & 2 deletions doc/destructors.rst
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,9 @@ Lifetime-tracking hooks

The memory management for Nim's standard ``string`` and ``seq`` types as
well as other standard collections is performed via so-called
"Lifetime-tracking hooks" or "type-bound operators". There are 3 different
hooks for each (generic or concrete) object type ``T`` (``T`` can also be a
"Lifetime-tracking hooks", which are particular `type bound operators <manual.html#procedures-type-bound-operators>`_.

There are 3 different hooks for each (generic or concrete) object type ``T`` (``T`` can also be a
``distinct`` type) that are called implicitly by the compiler.

(Note: The word "hook" here does not imply any kind of dynamic binding
Expand Down
42 changes: 42 additions & 0 deletions doc/manual.rst
Original file line number Diff line number Diff line change
Expand Up @@ -3678,6 +3678,48 @@ Is short for:
Routines
--------

A routine is a symbol of kind: `proc`, `func`, `method`, `iterator`, `macro`, `template`, `converter`.

Type bound operators
--------------------

A type bound operator is a `proc` or `func` whose name starts with `=` but isn't an operator
(i.e. containing only symbols, such as `==`). These are unrelated to setters
(see `properties <manual.html#procedures-properties>`_), which instead end in `=`.
A type bound operator declared for a type applies to the type regardless of whether
the operator is in scope (including if it is private).

.. code-block:: nim
# foo.nim:
var witness* = 0
type Foo[T] = object
proc initFoo*(T: typedesc): Foo[T] = discard
proc `=destroy`[T](x: var Foo[T]) = witness.inc # type bound operator
# main.nim:
import foo
block:
var a = initFoo(int)
doAssert witness == 0
doAssert witness == 1
block:
var a = initFoo(int)
doAssert witness == 1
`=destroy`(a) # can be called explicitly, even without being in scope
doAssert witness == 2
# will still be called upon exiting scope
doAssert witness == 3
Type bound operators currently include:
``=destroy``, ``=copy``, ``=sink``, ``=trace``, ``=dispose``, ``=deepcopy``
(some of which are still implementation defined and not yet documented).

For more details on some of those procs, see
`lifetimeminustracking-hooks <destructors.html#lifetimeminustracking-hooks>`_.

Nonoverloadable builtins
------------------------

Expand Down

0 comments on commit f09bf1f

Please sign in to comment.