new feature: package level objects
This commit is contained in:
parent
7889692523
commit
c17f6c7837
9 changed files with 93 additions and 11 deletions
|
|
@ -698,6 +698,44 @@ branch switch ``system.reset`` has to be used. Also, when the fields of a
|
|||
particular branch are specified during object construction, the correct value
|
||||
for the discriminator must be supplied at compile-time.
|
||||
|
||||
Package level objects
|
||||
---------------------
|
||||
|
||||
Every Nim module resides in a (nimble) package. An object type can be attached
|
||||
to the package it resides in. If that is done, the type can be referenced from
|
||||
other modules as an `incomplete`:idx: object type. This features allows to
|
||||
break up recursive type dependencies accross module boundaries. Incomplete
|
||||
object types are always passed ``byref`` and can only be used in pointer like
|
||||
contexts (``var/ref/ptr IncompleteObject``) in general since the compiler does
|
||||
not yet know the size of the object. To complete an incomplete object
|
||||
the ``package`` pragma has to be used. ``package`` implies ``byref``.
|
||||
|
||||
As long as a type ``T`` is incomplete ``sizeof(T)`` or "runtime type
|
||||
information" for ``T`` is not available.
|
||||
|
||||
|
||||
Example:
|
||||
|
||||
.. code-block:: nim
|
||||
|
||||
# module A (in an arbitrary package)
|
||||
type
|
||||
Pack.SomeObject = object ## declare as incomplete object of package 'Pack'
|
||||
Triple = object
|
||||
a, b, c: ref SomeObject ## pointers to incomplete objects are allowed
|
||||
|
||||
## Incomplete objects can be used as parameters:
|
||||
proc myproc(x: SomeObject) = discard
|
||||
|
||||
|
||||
.. code-block:: nim
|
||||
|
||||
# module B (in package "Pack")
|
||||
type
|
||||
SomeObject* {.package.} = object ## Use 'package' to complete the object
|
||||
s, t: string
|
||||
x, y: int
|
||||
|
||||
|
||||
Set type
|
||||
--------
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue