diff options
author | Araq <rumpf_a@web.de> | 2014-01-13 01:22:03 +0100 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2014-01-13 01:22:03 +0100 |
commit | 51ee524109cf7e3e86c676bc1676063a01bfd979 (patch) | |
tree | 0f611cc00834f0452a3f8ed1729c7b62f676f237 /doc/manual.txt | |
parent | 4045d7829b0ab9c8749aa701515a53c279db9958 (diff) | |
parent | 1280c56f386111b542c8f0effdd3e5cbc5e84622 (diff) | |
download | Nim-51ee524109cf7e3e86c676bc1676063a01bfd979.tar.gz |
Merge branch 'devel' of https://github.com/Araq/Nimrod into devel
Diffstat (limited to 'doc/manual.txt')
-rw-r--r-- | doc/manual.txt | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/doc/manual.txt b/doc/manual.txt index 5024fffec..2d8feca17 100644 --- a/doc/manual.txt +++ b/doc/manual.txt @@ -3837,6 +3837,60 @@ This is a simple syntactic transformation into: Special Types ============= +static[T] +--------- + +As their name suggests, static params must be known at compile-time: + +.. code-block:: nimrod + + proc precompiledRegex(pattern: static[string]): TRegEx = + var res {.global.} = re(pattern) + return res + + precompiledRegex("/d+") # Replaces the call with a precompiled + # regex, stored in a global variable + + precompiledRegex(paramStr(1)) # Error, command-line options + # are not known at compile-time + + +For the purposes of code generation, all static params are treated as +generic params - the proc will be compiled separately for each unique +supplied value (or combination of values). + +Furthermore, the system module defines a `semistatic[T]` type than can be +used to declare procs accepting both static and run-time values, which can +optimize their body according to the supplied param using the `isStatic(p)` +predicate: + +.. code-block:: nimrod + + # The following proc will be compiled once for each unique static + # value and also once for the case handling all run-time values: + + proc re(pattern: semistatic[string]): TRegEx = + when isStatic(pattern): + return precompiledRegex(pattern) + else: + return compile(pattern) + +Static params can also appear in the signatures of generic types: + +.. code-block:: nimrod + + type + Matrix[M,N: static[int]; T: Number] = array[0..(M*N - 1), T] + # Please, note how `Number` is just a type constraint here, while + # `static[int]` requires us to supply a compile-time int value + + AffineTransform2D[T] = Matrix[3, 3, T] + AffineTransform3D[T] = Matrix[4, 4, T] + + AffineTransform3D[float] # OK + AffineTransform2D[string] # Error, `string` is not a `Number` + + typedesc -------- |