docs: fix some spelling errors (#19816)
* docs: fix some spelling errors * contributing: fix spelling error Co-authored-by: konsumlamm <44230978+konsumlamm@users.noreply.github.com> * Update contributing.md * Update intern.md * Update manual.md * Update manual_experimental_strictnotnil.md * Update nimgrep_cmdline.txt * Update pegdocs.txt * Update testament.md * Update tut1.md Co-authored-by: konsumlamm <44230978+konsumlamm@users.noreply.github.com> Co-authored-by: Clay Sweetser <Varriount@users.noreply.github.com>
This commit is contained in:
parent
e8ae2dc90b
commit
b4157f6772
10 changed files with 143 additions and 141 deletions
|
|
@ -8,7 +8,7 @@ Contributing
|
||||||
.. contents::
|
.. contents::
|
||||||
|
|
||||||
|
|
||||||
Contributing happens via "Pull requests" (PR) on github. Every PR needs to be
|
Contributing happens via "Pull requests" (PR) on GitHub. Every PR needs to be
|
||||||
reviewed before it can be merged and the Continuous Integration should be green.
|
reviewed before it can be merged and the Continuous Integration should be green.
|
||||||
The title of a PR should contain a brief description. If it fixes an issue,
|
The title of a PR should contain a brief description. If it fixes an issue,
|
||||||
in addition to the number of the issue, the title should also contain a description
|
in addition to the number of the issue, the title should also contain a description
|
||||||
|
|
@ -158,7 +158,7 @@ To run a single test:
|
||||||
```
|
```
|
||||||
|
|
||||||
For reproducible tests (to reproduce an environment more similar to the one
|
For reproducible tests (to reproduce an environment more similar to the one
|
||||||
run by Continuous Integration on github actions/azure pipelines), you may want to disable your
|
run by Continuous Integration on GitHub actions/azure pipelines), you may want to disable your
|
||||||
local configuration (e.g. in ``~/.config/nim/nim.cfg``) which may affect some
|
local configuration (e.g. in ``~/.config/nim/nim.cfg``) which may affect some
|
||||||
tests; this can also be achieved by using
|
tests; this can also be achieved by using
|
||||||
`export XDG_CONFIG_HOME=pathtoAlternateConfig`:cmd: before running `./koch`:cmd:
|
`export XDG_CONFIG_HOME=pathtoAlternateConfig`:cmd: before running `./koch`:cmd:
|
||||||
|
|
@ -198,8 +198,8 @@ tell you if any new tests passed/failed.
|
||||||
Deprecation
|
Deprecation
|
||||||
===========
|
===========
|
||||||
|
|
||||||
Backward compatibility is important, so instead of a rename you need to deprecate
|
Backwards compatibility is important. When renaming types, procedures, etc. the old name
|
||||||
the old name and introduce a new name:
|
must be marked as deprecated using the `deprecated` pragma:
|
||||||
|
|
||||||
```nim
|
```nim
|
||||||
# for routines (proc/template/macro/iterator) and types:
|
# for routines (proc/template/macro/iterator) and types:
|
||||||
|
|
@ -310,7 +310,7 @@ Inline monospaced text can be input using \`single backticks\` or
|
||||||
the latter are not.
|
the latter are not.
|
||||||
To avoid accidental highlighting follow this rule in ``*.nim`` files:
|
To avoid accidental highlighting follow this rule in ``*.nim`` files:
|
||||||
|
|
||||||
* use single backticks for fragments of code in Nim and other
|
* Use single backticks for fragments of code in Nim and other
|
||||||
programming languages, including identifiers, in ``*.nim`` files.
|
programming languages, including identifiers, in ``*.nim`` files.
|
||||||
|
|
||||||
For languages other than Nim add a role after final backtick,
|
For languages other than Nim add a role after final backtick,
|
||||||
|
|
@ -326,12 +326,12 @@ To avoid accidental highlighting follow this rule in ``*.nim`` files:
|
||||||
Highlight shell commands by ``:cmd:`` role; for command line options use
|
Highlight shell commands by ``:cmd:`` role; for command line options use
|
||||||
``:option:`` role, e.g.: \`--docInternal\`:option:.
|
``:option:`` role, e.g.: \`--docInternal\`:option:.
|
||||||
|
|
||||||
* prefer double backticks otherwise:
|
* Use double backticks:
|
||||||
|
|
||||||
* for file names: \`\`os.nim\`\`
|
* For file names: \`\`os.nim\`\`
|
||||||
* for fragments of strings **not** enclosed by `"` and `"` and not
|
* For fragments of strings **not** enclosed by `"` and `"` and not
|
||||||
related to code, e.g. text of compiler messages
|
related to code, e.g. text of compiler messages
|
||||||
* also when code ends with a standalone ``\`` (otherwise a combination of
|
* When code ends with a standalone ``\`` (otherwise a combination of
|
||||||
``\`` and a final \` would get escaped)
|
``\`` and a final \` would get escaped)
|
||||||
|
|
||||||
.. Note:: ``*.rst`` files have ``:literal:`` as their default role.
|
.. Note:: ``*.rst`` files have ``:literal:`` as their default role.
|
||||||
|
|
@ -396,7 +396,7 @@ rationale: https://forum.nim-lang.org/t/4089
|
||||||
|
|
||||||
.. _tests_use_doAssert:
|
.. _tests_use_doAssert:
|
||||||
Use `doAssert` (or `unittest.check`, `unittest.require`), not `assert` in all
|
Use `doAssert` (or `unittest.check`, `unittest.require`), not `assert` in all
|
||||||
tests so they'll be enabled even with `--assertions:off`:option:.
|
tests, so they'll be enabled even with `--assertions:off`:option:.
|
||||||
|
|
||||||
```nim
|
```nim
|
||||||
block: # foo
|
block: # foo
|
||||||
|
|
@ -423,7 +423,7 @@ second example below:
|
||||||
.. _delegate_printing:
|
.. _delegate_printing:
|
||||||
Delegate printing to caller: return `string` instead of calling `echo`
|
Delegate printing to caller: return `string` instead of calling `echo`
|
||||||
rationale: it's more flexible (e.g. allows the caller to call custom printing,
|
rationale: it's more flexible (e.g. allows the caller to call custom printing,
|
||||||
including prepending location info, writing to log files, etc).
|
including prepending location info, writing to log files, etc.).
|
||||||
|
|
||||||
```nim
|
```nim
|
||||||
proc foo() = echo "bar" # bad
|
proc foo() = echo "bar" # bad
|
||||||
|
|
@ -476,7 +476,7 @@ General commit rules
|
||||||
your editor reformatted automatically the code or whatever different reason,
|
your editor reformatted automatically the code or whatever different reason,
|
||||||
this should be excluded from the commit.
|
this should be excluded from the commit.
|
||||||
|
|
||||||
*Tip:* Never commit everything as is using `git commit -a`:cmd:, but review
|
*Tip:* Never commit everything as-is using `git commit -a`:cmd:, but review
|
||||||
carefully your changes with `git add -p`:cmd:.
|
carefully your changes with `git add -p`:cmd:.
|
||||||
|
|
||||||
4. Changes should not introduce any trailing whitespace.
|
4. Changes should not introduce any trailing whitespace.
|
||||||
|
|
@ -494,16 +494,16 @@ General commit rules
|
||||||
Fixes #123; refs #124
|
Fixes #123; refs #124
|
||||||
|
|
||||||
indicates that issue ``#123`` is completely fixed (GitHub may automatically
|
indicates that issue ``#123`` is completely fixed (GitHub may automatically
|
||||||
close it when the PR is committed), wheres issue ``#124`` is referenced
|
close it when the PR is committed), whereas issue ``#124`` is referenced
|
||||||
(e.g.: partially fixed) and won't close the issue when committed.
|
(e.g.: partially fixed) and won't close the issue when committed.
|
||||||
|
|
||||||
6. PR body (not just PR title) should contain references to fixed/referenced github
|
6. PR body (not just PR title) should contain references to fixed/referenced GitHub
|
||||||
issues, e.g.: ``fix #123`` or ``refs #123``. This is so that you get proper cross
|
issues, e.g.: ``fix #123`` or ``refs #123``. This is so that you get proper
|
||||||
referencing from linked issue to the PR (github won't make those links with just
|
cross-referencing from linked issue to the PR (GitHub won't make those links
|
||||||
PR title, and commit messages aren't always sufficient to ensure that, e.g.
|
with just a PR title, and commit messages aren't always sufficient to ensure
|
||||||
can't be changed after a PR is merged).
|
that, e.g. can't be changed after a PR is merged).
|
||||||
|
|
||||||
7. Commits should be always be rebased against devel (so a fast forward
|
7. Commits should be always be rebased against devel (so a fast-forward
|
||||||
merge can happen)
|
merge can happen)
|
||||||
|
|
||||||
e.g.: use `git pull --rebase origin devel`:cmd:. This is to avoid messing up
|
e.g.: use `git pull --rebase origin devel`:cmd:. This is to avoid messing up
|
||||||
|
|
@ -523,14 +523,14 @@ Continuous Integration (CI)
|
||||||
1. Continuous Integration is by default run on every push in a PR; this clogs
|
1. Continuous Integration is by default run on every push in a PR; this clogs
|
||||||
the CI pipeline and affects other PR's; if you don't need it (e.g. for WIP or
|
the CI pipeline and affects other PR's; if you don't need it (e.g. for WIP or
|
||||||
documentation only changes), add ``[skip ci]`` to your commit message title.
|
documentation only changes), add ``[skip ci]`` to your commit message title.
|
||||||
This convention is supported by our github actions pipelines and our azure pipeline
|
This convention is supported by our GitHub actions pipelines and our azure pipeline
|
||||||
(using custom logic, which should complete in < 1mn) as well as our former other pipelines:
|
(using custom logic, which should complete in < 1mn) as well as our former other pipelines:
|
||||||
`Appveyor <https://www.appveyor.com/docs/how-to/filtering-commits/#skip-directive-in-commit-message>`_
|
`Appveyor <https://www.appveyor.com/docs/how-to/filtering-commits/#skip-directive-in-commit-message>`_
|
||||||
and `Travis <https://docs.travis-ci.com/user/customizing-the-build/#skipping-a-build>`_.
|
and `Travis <https://docs.travis-ci.com/user/customizing-the-build/#skipping-a-build>`_.
|
||||||
|
|
||||||
2. Consider enabling CI (azure, GitHub actions and builds.sr.ht) in your own Nim fork, and
|
2. Consider enabling CI (azure, GitHub actions and builds.sr.ht) in your own Nim fork, and
|
||||||
waiting for CI to be green in that fork (fixing bugs as needed) before
|
waiting for CI to be green in that fork (fixing bugs as needed) before
|
||||||
opening your PR in the original Nim repo, so as to reduce CI congestion. Same
|
opening your PR in the original Nim repo, to reduce CI congestion. Same
|
||||||
applies for updates on a PR: you can test commits on a separate private
|
applies for updates on a PR: you can test commits on a separate private
|
||||||
branch before updating the main PR.
|
branch before updating the main PR.
|
||||||
|
|
||||||
|
|
@ -547,11 +547,12 @@ Debugging CI failures, flaky tests, etc
|
||||||
follow these instructions to only restart the jobs that failed:
|
follow these instructions to only restart the jobs that failed:
|
||||||
|
|
||||||
* Azure: if on your own fork, it's possible from inside azure console
|
* Azure: if on your own fork, it's possible from inside azure console
|
||||||
(e.g. ``dev.azure.com/username/username/_build/results?buildId=1430&view=results``) via ``rerun failed jobs`` on top.
|
(e.g. ``dev.azure.com/username/username/_build/results?buildId=1430&view=results``) via
|
||||||
|
``rerun failed jobs`` on top.
|
||||||
If either on you own fork or in Nim repo, it's possible from inside GitHub UI
|
If either on you own fork or in Nim repo, it's possible from inside GitHub UI
|
||||||
under checks tab, see https://github.com/timotheecour/Nim/issues/211#issuecomment-629751569
|
under checks tab, see https://github.com/timotheecour/Nim/issues/211#issuecomment-629751569
|
||||||
* GitHub actions: under "Checks" tab, click "Re-run jobs" in the right.
|
* GitHub actions: under "Checks" tab, click "Re-run jobs" in the right.
|
||||||
* builds.sr.ht: create a sourcehut account so you can restart a PR job as illustrated.
|
* builds.sr.ht: create a SourceHut account so that you can restart a PR job as illustrated.
|
||||||
builds.sr.ht also allows you to ssh to a CI machine which can help a lot for debugging
|
builds.sr.ht also allows you to ssh to a CI machine which can help a lot for debugging
|
||||||
issues, see docs in https://man.sr.ht/builds.sr.ht/build-ssh.md and
|
issues, see docs in https://man.sr.ht/builds.sr.ht/build-ssh.md and
|
||||||
https://drewdevault.com/2019/08/19/Introducing-shell-access-for-builds.html; see
|
https://drewdevault.com/2019/08/19/Introducing-shell-access-for-builds.html; see
|
||||||
|
|
@ -566,7 +567,7 @@ Code reviews
|
||||||
https://forum.nim-lang.org/t/4317
|
https://forum.nim-lang.org/t/4317
|
||||||
|
|
||||||
2. When reviewing large diffs that may involve code moving around, GitHub's interface
|
2. When reviewing large diffs that may involve code moving around, GitHub's interface
|
||||||
doesn't help much as it doesn't highlight moves. Instead, you can use something
|
doesn't help much, as it doesn't highlight moves. Instead, you can use something
|
||||||
like this, see visual results `here <https://github.com/nim-lang/Nim/pull/10431#issuecomment-456968196>`_:
|
like this, see visual results `here <https://github.com/nim-lang/Nim/pull/10431#issuecomment-456968196>`_:
|
||||||
|
|
||||||
```cmd
|
```cmd
|
||||||
|
|
@ -619,7 +620,7 @@ Time handling, especially the `Time` type are also covered by this rule.
|
||||||
Existing, battle-tested modules stay
|
Existing, battle-tested modules stay
|
||||||
------------------------------------
|
------------------------------------
|
||||||
|
|
||||||
Reason: There is no benefit in moving them around just to fullfill some design
|
Reason: There is no benefit in moving them around just to fulfill some design
|
||||||
fashion as in "Nim's core MUST BE SMALL". If you don't like an existing module,
|
fashion as in "Nim's core MUST BE SMALL". If you don't like an existing module,
|
||||||
don't import it. If a compilation target (e.g. JS) cannot support a module,
|
don't import it. If a compilation target (e.g. JS) cannot support a module,
|
||||||
document this limitation.
|
document this limitation.
|
||||||
|
|
@ -633,7 +634,7 @@ Syntactic helpers can start as experimental stdlib modules
|
||||||
|
|
||||||
Reason: Generally speaking as external dependencies they are not exposed
|
Reason: Generally speaking as external dependencies they are not exposed
|
||||||
to enough users so that we can see if the shortcuts provide enough benefit
|
to enough users so that we can see if the shortcuts provide enough benefit
|
||||||
or not. Many programmers avoid external dependencies, even moreso for
|
or not. Many programmers avoid external dependencies, especially for
|
||||||
"tiny syntactic improvements". However, this is only true for really good
|
"tiny syntactic improvements". However, this is only true for really good
|
||||||
syntactic improvements that have the potential to clean up other parts of
|
syntactic improvements that have the potential to clean up other parts of
|
||||||
the Nim library substantially. If in doubt, new stdlib modules should start
|
the Nim library substantially. If in doubt, new stdlib modules should start
|
||||||
|
|
@ -658,7 +659,7 @@ to existing modules is acceptable. For two reasons:
|
||||||
("Why does sequtils lack a `countIt`?
|
("Why does sequtils lack a `countIt`?
|
||||||
Because version 1.0 happens to have lacked it? Silly...")
|
Because version 1.0 happens to have lacked it? Silly...")
|
||||||
2. To encourage contributions. Contributors often start with PRs that
|
2. To encourage contributions. Contributors often start with PRs that
|
||||||
add simple things and then they stay and also fix bugs. Nim is an
|
add simple things, then they stay and also fix bugs. Nim is an
|
||||||
open source project and lives from people's contributions and involvement.
|
open source project and lives from people's contributions and involvement.
|
||||||
Newly introduced issues have to be balanced against motivating new people. We know where
|
Newly introduced issues have to be balanced against motivating new people. We know where
|
||||||
to find perfectly designed pieces of software that have no bugs -- these are the systems
|
to find perfectly designed pieces of software that have no bugs -- these are the systems
|
||||||
|
|
@ -684,7 +685,7 @@ Conventions
|
||||||
Breaking Changes
|
Breaking Changes
|
||||||
================
|
================
|
||||||
|
|
||||||
Introducing breaking changes, no matter how well intentioned,
|
Introducing breaking changes, no matter how well-intentioned,
|
||||||
creates long-term problems for the community, in particular those looking to promote
|
creates long-term problems for the community, in particular those looking to promote
|
||||||
reusable Nim code in libraries: In the Nim distribution, critical security and bugfixes,
|
reusable Nim code in libraries: In the Nim distribution, critical security and bugfixes,
|
||||||
language changes and community improvements are bundled in a single distribution - it is
|
language changes and community improvements are bundled in a single distribution - it is
|
||||||
|
|
@ -719,14 +720,14 @@ Examples of run-time breaking changes:
|
||||||
* "Nim's path handling procs like `getXDir` now consistently lack the trailing slash"
|
* "Nim's path handling procs like `getXDir` now consistently lack the trailing slash"
|
||||||
* "Nim's strformat implementation is now more consistent with Python"
|
* "Nim's strformat implementation is now more consistent with Python"
|
||||||
|
|
||||||
Instead write new code that explicitly announces the feature you think we announced but
|
Instead, write new code that explicitly announces the feature you think we announced but
|
||||||
didn't. For example, `strformat` does not say "it's compatible with Python", it
|
didn't. For example, `strformat` does not say "it's compatible with Python", it
|
||||||
says "inspired by Python's f-strings". This new code can be submitted to the stdlib
|
says "inspired by Python's f-strings". This new code can be submitted to the stdlib
|
||||||
and the old code can be deprecated or it can be published as a Nimble package.
|
and the old code can be deprecated or published as a Nimble package.
|
||||||
|
|
||||||
Sometimes, a run-time breaking change is most desirable: For example, a string
|
Sometimes, a run-time breaking change is most desirable: For example, a string
|
||||||
representation of a floating point number that "roundtrips" is much better than
|
representation of a floating point number that "roundtrips" is much better than
|
||||||
a string represenation that doesn't. These run-time breaking changes must start in the
|
a string representation that doesn't. These run-time breaking changes must start in the
|
||||||
state "opt-in" via a new `-d:nimPreviewX` or command line flag and then should become
|
state "opt-in" via a new `-d:nimPreviewX` or command line flag and then should become
|
||||||
the new default later, in follow-up versions. This way users can track
|
the new default later, in follow-up versions. This way users can track
|
||||||
regressions more easily. ("git bisect" is not an acceptable alternative, that's for
|
regressions more easily. ("git bisect" is not an acceptable alternative, that's for
|
||||||
|
|
@ -740,7 +741,8 @@ Compile-time breaking changes
|
||||||
-----------------------------
|
-----------------------------
|
||||||
|
|
||||||
Compile-time breaking changes are usually easier to handle, but for large code bases
|
Compile-time breaking changes are usually easier to handle, but for large code bases
|
||||||
it can also be much work and it can hinder the adoption of a new Nim release.
|
they can also involve a large amount of work and can hinder the adoption of a new
|
||||||
|
Nim release.
|
||||||
Additive approaches are to be preferred here as well.
|
Additive approaches are to be preferred here as well.
|
||||||
|
|
||||||
Examples of compile-time breaking changes include (but are not limited to):
|
Examples of compile-time breaking changes include (but are not limited to):
|
||||||
|
|
@ -748,10 +750,10 @@ Examples of compile-time breaking changes include (but are not limited to):
|
||||||
* Renaming functions and modules, or moving things. Instead of a direct rename,
|
* Renaming functions and modules, or moving things. Instead of a direct rename,
|
||||||
deprecate the old name and introduce a new one.
|
deprecate the old name and introduce a new one.
|
||||||
* Renaming the parameter names: Thanks to Nim's "named parameter" calling syntax
|
* Renaming the parameter names: Thanks to Nim's "named parameter" calling syntax
|
||||||
like `f(x = 0, y = 1)` this is a breaking change. Instead live with the existing
|
like `f(x = 0, y = 1)` this is a breaking change. Instead, live with the existing
|
||||||
parameter names.
|
parameter names.
|
||||||
* Adding an enum value to an existing enum. Nim's exhaustive case statements stop
|
* Adding an enum value to an existing enum. Nim's exhaustive case statements stop
|
||||||
compiling after such a change. Instead consider to introduce new `bool`
|
compiling after such a change. Instead, consider to introduce new `bool`
|
||||||
fields/parameters. This can be impractical though, so we use good judgement
|
fields/parameters. This can be impractical though, so we use good judgement
|
||||||
and our list of "important packages" to see if it doesn't break too much code
|
and our list of "important packages" to see if it doesn't break too much code
|
||||||
out there in practice.
|
out there in practice.
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ Iff a proc is side effect free and all its argument are evaluable at
|
||||||
compile time, it can be evaluated by the compiler. However, really
|
compile time, it can be evaluated by the compiler. However, really
|
||||||
difficult is the ``newString`` proc: If it is simply wrapped, it
|
difficult is the ``newString`` proc: If it is simply wrapped, it
|
||||||
should not be evaluated at compile time! On other occasions it can
|
should not be evaluated at compile time! On other occasions it can
|
||||||
and should be evaluted:
|
and should be evaluated:
|
||||||
|
|
||||||
.. code-block:: nim
|
.. code-block:: nim
|
||||||
proc toUpper(s: string): string =
|
proc toUpper(s: string): string =
|
||||||
|
|
|
||||||
|
|
@ -87,7 +87,7 @@ Bisecting for regressions
|
||||||
-------------------------
|
-------------------------
|
||||||
|
|
||||||
There are often times when there is a bug that is caused by a regression in the
|
There are often times when there is a bug that is caused by a regression in the
|
||||||
compiler or stdlib. Bisecting the Nim repo commits is a usefull tool to identify
|
compiler or stdlib. Bisecting the Nim repo commits is a useful tool to identify
|
||||||
what commit introduced the regression.
|
what commit introduced the regression.
|
||||||
|
|
||||||
Even if it's not known whether a bug is caused by a regression, bisection can reduce
|
Even if it's not known whether a bug is caused by a regression, bisection can reduce
|
||||||
|
|
@ -117,7 +117,7 @@ fastest to build a compiler that is instrumented for debugging from an
|
||||||
existing release build. `koch temp`:cmd: provides a convenient method of doing
|
existing release build. `koch temp`:cmd: provides a convenient method of doing
|
||||||
just that.
|
just that.
|
||||||
|
|
||||||
By default running `koch temp`:cmd: will build a lean version of the compiler
|
By default, running `koch temp`:cmd: will build a lean version of the compiler
|
||||||
with `-d:debug`:option: enabled. The compiler is written to `bin/nim_temp` by
|
with `-d:debug`:option: enabled. The compiler is written to `bin/nim_temp` by
|
||||||
default. A lean version of the compiler lacks JS and documentation generation.
|
default. A lean version of the compiler lacks JS and documentation generation.
|
||||||
|
|
||||||
|
|
@ -125,7 +125,7 @@ default. A lean version of the compiler lacks JS and documentation generation.
|
||||||
with `testament --nim:bin/nim_temp r tests/category/tsometest`:cmd:.
|
with `testament --nim:bin/nim_temp r tests/category/tsometest`:cmd:.
|
||||||
|
|
||||||
`koch temp`:cmd: will build the temporary compiler with the `-d:debug`:option:
|
`koch temp`:cmd: will build the temporary compiler with the `-d:debug`:option:
|
||||||
enabled. Here are compiler options that are of interest for debugging:
|
enabled. Here are compiler options that are of interest when debugging:
|
||||||
|
|
||||||
* `-d:debug`:option:\: enables `assert` statements and stacktraces and all
|
* `-d:debug`:option:\: enables `assert` statements and stacktraces and all
|
||||||
runtime checks
|
runtime checks
|
||||||
|
|
@ -156,11 +156,11 @@ Debug logging
|
||||||
|
|
||||||
"Printf debugging" is still the most appropriate way to debug many problems
|
"Printf debugging" is still the most appropriate way to debug many problems
|
||||||
arising in compiler development. The typical usage of breakpoints to debug
|
arising in compiler development. The typical usage of breakpoints to debug
|
||||||
the code is often less practical, because almost all of the code paths in the
|
the code is often less practical, because almost all code paths in the
|
||||||
compiler will be executed hundreds of times before a particular section of the
|
compiler will be executed hundreds of times before a particular section of the
|
||||||
tested program is reached where the newly developed code must be activated.
|
tested program is reached where the newly developed code must be activated.
|
||||||
|
|
||||||
To work-around this problem, you'll typically introduce an if statement in the
|
To work around this problem, you'll typically introduce an if statement in the
|
||||||
compiler code detecting more precisely the conditions where the tested feature
|
compiler code detecting more precisely the conditions where the tested feature
|
||||||
is being used. One very common way to achieve this is to use the `mdbg` condition,
|
is being used. One very common way to achieve this is to use the `mdbg` condition,
|
||||||
which will be true only in contexts, processing expressions and statements from
|
which will be true only in contexts, processing expressions and statements from
|
||||||
|
|
@ -374,7 +374,7 @@ Files that may need changed for your platform include:
|
||||||
Add os/cpu compiler/linker flags.
|
Add os/cpu compiler/linker flags.
|
||||||
|
|
||||||
If the `--os` or `--cpu` options aren't passed to the compiler, then Nim will
|
If the `--os` or `--cpu` options aren't passed to the compiler, then Nim will
|
||||||
determine the current host os, cpu and endianess from `system.cpuEndian`,
|
determine the current host os, cpu and endianness from `system.cpuEndian`,
|
||||||
`system.hostOS` and `system.hostCPU`. Those values are derived from
|
`system.hostOS` and `system.hostCPU`. Those values are derived from
|
||||||
`compiler/platform.nim`.
|
`compiler/platform.nim`.
|
||||||
|
|
||||||
|
|
@ -398,17 +398,17 @@ Runtime type information
|
||||||
programming language:
|
programming language:
|
||||||
|
|
||||||
Garbage collection
|
Garbage collection
|
||||||
The old GCs use the RTTI for traversing abitrary Nim types, but usually
|
The old GCs use the RTTI for traversing arbitrary Nim types, but usually
|
||||||
only the `marker` field which contains a proc that does the traversal.
|
only the `marker` field which contains a proc that does the traversal.
|
||||||
|
|
||||||
Complex assignments
|
Complex assignments
|
||||||
Sequences and strings are implemented as
|
Sequences and strings are implemented as
|
||||||
pointers to resizeable buffers, but Nim requires copying for
|
pointers to resizable buffers, but Nim requires copying for
|
||||||
assignments. Apart from RTTI the compiler also generates copy procedures
|
assignments. Apart from RTTI the compiler also generates copy procedures
|
||||||
as a specialization.
|
as a specialization.
|
||||||
|
|
||||||
We already know the type information as a graph in the compiler.
|
We already know the type information as a graph in the compiler.
|
||||||
Thus we need to serialize this graph as RTTI for C code generation.
|
Thus, we need to serialize this graph as RTTI for C code generation.
|
||||||
Look at the file ``lib/system/hti.nim`` for more information.
|
Look at the file ``lib/system/hti.nim`` for more information.
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -418,7 +418,7 @@ Magics and compilerProcs
|
||||||
The `system` module contains the part of the RTL which needs support by
|
The `system` module contains the part of the RTL which needs support by
|
||||||
compiler magic. The C code generator generates the C code for it, just like any other
|
compiler magic. The C code generator generates the C code for it, just like any other
|
||||||
module. However, calls to some procedures like `addInt` are inserted by
|
module. However, calls to some procedures like `addInt` are inserted by
|
||||||
the generator. Therefore there is a table (`compilerprocs`)
|
the generator. Therefore, there is a table (`compilerprocs`)
|
||||||
with all symbols that are marked as `compilerproc`. `compilerprocs` are
|
with all symbols that are marked as `compilerproc`. `compilerprocs` are
|
||||||
needed by the code generator. A `magic` proc is not the same as a
|
needed by the code generator. A `magic` proc is not the same as a
|
||||||
`compilerproc`: A `magic` is a proc that needs compiler magic for its
|
`compilerproc`: A `magic` is a proc that needs compiler magic for its
|
||||||
|
|
@ -524,7 +524,7 @@ This should produce roughly this code:
|
||||||
proc add(x: int): tuple[prc, data: EnvX] =
|
proc add(x: int): tuple[prc, data: EnvX] =
|
||||||
var ex: EnvX
|
var ex: EnvX
|
||||||
ex.x = x
|
ex.x = x
|
||||||
result = (labmdaY, ex)
|
result = (lambdaY, ex)
|
||||||
|
|
||||||
var tmp = add(2)
|
var tmp = add(2)
|
||||||
var tmp2 = tmp.fn(4, tmp.data)
|
var tmp2 = tmp.fn(4, tmp.data)
|
||||||
|
|
@ -566,12 +566,12 @@ Internals
|
||||||
---------
|
---------
|
||||||
|
|
||||||
Lambda lifting is implemented as part of the `transf` pass. The `transf`
|
Lambda lifting is implemented as part of the `transf` pass. The `transf`
|
||||||
pass generates code to setup the environment and to pass it around. However,
|
pass generates code to set up the environment and to pass it around. However,
|
||||||
this pass does not change the types! So we have some kind of mismatch here; on
|
this pass does not change the types! So we have some kind of mismatch here; on
|
||||||
the one hand the proc expression becomes an explicit tuple, on the other hand
|
the one hand the proc expression becomes an explicit tuple, on the other hand
|
||||||
the tyProc(ccClosure) type is not changed. For C code generation it's also
|
the tyProc(ccClosure) type is not changed. For C code generation it's also
|
||||||
important the hidden formal param is `void*`:c: and not something more
|
important the hidden formal param is `void*`:c: and not something more
|
||||||
specialized. However the more specialized env type needs to passed to the
|
specialized. However, the more specialized env type needs to passed to the
|
||||||
backend somehow. We deal with this by modifying `s.ast[paramPos]` to contain
|
backend somehow. We deal with this by modifying `s.ast[paramPos]` to contain
|
||||||
the formal hidden parameter, but not `s.typ`!
|
the formal hidden parameter, but not `s.typ`!
|
||||||
|
|
||||||
|
|
@ -586,14 +586,14 @@ Integer literals
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
In Nim, there is a redundant way to specify the type of an
|
In Nim, there is a redundant way to specify the type of an
|
||||||
integer literal. First of all, it should be unsurprising that every
|
integer literal. First, it should be unsurprising that every
|
||||||
node has a node kind. The node of an integer literal can be any of the
|
node has a node kind. The node of an integer literal can be any of the
|
||||||
following values::
|
following values::
|
||||||
|
|
||||||
nkIntLit, nkInt8Lit, nkInt16Lit, nkInt32Lit, nkInt64Lit,
|
nkIntLit, nkInt8Lit, nkInt16Lit, nkInt32Lit, nkInt64Lit,
|
||||||
nkUIntLit, nkUInt8Lit, nkUInt16Lit, nkUInt32Lit, nkUInt64Lit
|
nkUIntLit, nkUInt8Lit, nkUInt16Lit, nkUInt32Lit, nkUInt64Lit
|
||||||
|
|
||||||
On top of that, there is also the `typ` field for the type. It the
|
On top of that, there is also the `typ` field for the type. The
|
||||||
kind of the `typ` field can be one of the following ones, and it
|
kind of the `typ` field can be one of the following ones, and it
|
||||||
should be matching the literal kind::
|
should be matching the literal kind::
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -91,7 +91,7 @@ The nature of this executable depends on the compiler implementation; it may,
|
||||||
for example, be a native binary or JavaScript source code.
|
for example, be a native binary or JavaScript source code.
|
||||||
|
|
||||||
In a typical Nim program, most of the code is compiled into the executable.
|
In a typical Nim program, most of the code is compiled into the executable.
|
||||||
However, some of the code may be executed at
|
However, some code may be executed at
|
||||||
`compile-time`:idx:. This can include constant expressions, macro definitions,
|
`compile-time`:idx:. This can include constant expressions, macro definitions,
|
||||||
and Nim procedures used by macro definitions. Most of the Nim language is
|
and Nim procedures used by macro definitions. Most of the Nim language is
|
||||||
supported at compile-time, but there are some restrictions -- see `Restrictions
|
supported at compile-time, but there are some restrictions -- see `Restrictions
|
||||||
|
|
@ -114,7 +114,7 @@ provides a means to disable these `runtime checks`:idx:. See the section
|
||||||
pragmas_ for details.
|
pragmas_ for details.
|
||||||
|
|
||||||
Whether a panic results in an exception or in a fatal error is
|
Whether a panic results in an exception or in a fatal error is
|
||||||
implementation specific. Thus the following program is invalid; even though the
|
implementation specific. Thus, the following program is invalid; even though the
|
||||||
code purports to catch the `IndexDefect` from an out-of-bounds array access, the
|
code purports to catch the `IndexDefect` from an out-of-bounds array access, the
|
||||||
compiler may instead choose to allow the program to die with a fatal error.
|
compiler may instead choose to allow the program to die with a fatal error.
|
||||||
|
|
||||||
|
|
@ -127,7 +127,7 @@ compiler may instead choose to allow the program to die with a fatal error.
|
||||||
echo "invalid index"
|
echo "invalid index"
|
||||||
```
|
```
|
||||||
|
|
||||||
The current implementation allows to switch between these different behaviors
|
The current implementation allows switching between these different behaviors
|
||||||
via `--panics:on|off`:option:. When panics are turned on, the program dies with a
|
via `--panics:on|off`:option:. When panics are turned on, the program dies with a
|
||||||
panic, if they are turned off the runtime errors are turned into
|
panic, if they are turned off the runtime errors are turned into
|
||||||
exceptions. The benefit of `--panics:on`:option: is that it produces smaller binary
|
exceptions. The benefit of `--panics:on`:option: is that it produces smaller binary
|
||||||
|
|
@ -388,7 +388,7 @@ contain the following `escape sequences`:idx:\ :
|
||||||
================== ===================================================
|
================== ===================================================
|
||||||
|
|
||||||
|
|
||||||
Strings in Nim may contain any 8-bit value, even embedded zeros. However
|
Strings in Nim may contain any 8-bit value, even embedded zeros. However,
|
||||||
some operations may interpret the first binary zero as a terminator.
|
some operations may interpret the first binary zero as a terminator.
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -502,7 +502,7 @@ The `Rune` type can represent any Unicode character.
|
||||||
`Rune` is declared in the `unicode module <unicode.html>`_.
|
`Rune` is declared in the `unicode module <unicode.html>`_.
|
||||||
|
|
||||||
A character literal that does not end in `'` is interpreted as `'` if there
|
A character literal that does not end in `'` is interpreted as `'` if there
|
||||||
is a preceeding backtick token. There must be no whitespace between the preceeding
|
is a preceding backtick token. There must be no whitespace between the preceding
|
||||||
backtick token and the character literal. This special case ensures that a declaration
|
backtick token and the character literal. This special case ensures that a declaration
|
||||||
like ``proc `'customLiteral`(s: string)`` is valid. ``proc `'customLiteral`(s: string)``
|
like ``proc `'customLiteral`(s: string)`` is valid. ``proc `'customLiteral`(s: string)``
|
||||||
is the same as ``proc `'\''customLiteral`(s: string)``.
|
is the same as ``proc `'\''customLiteral`(s: string)``.
|
||||||
|
|
@ -566,8 +566,8 @@ an expression `-128'i8` should be valid and without this special case, this woul
|
||||||
be impossible -- `128` is not a valid `int8` value, only `-128` is.
|
be impossible -- `128` is not a valid `int8` value, only `-128` is.
|
||||||
|
|
||||||
For the `unary_minus` rule there are further restrictions that are not covered
|
For the `unary_minus` rule there are further restrictions that are not covered
|
||||||
in the formal grammar. For `-` to be part of the number literal its immediately
|
in the formal grammar. For `-` to be part of the number literal the immediately
|
||||||
preceeding character has to be in the
|
preceding character has to be in the
|
||||||
set `{' ', '\t', '\n', '\r', ',', ';', '(', '[', '{'}`. This set was designed to
|
set `{' ', '\t', '\n', '\r', ',', ';', '(', '[', '{'}`. This set was designed to
|
||||||
cover most cases in a natural manner.
|
cover most cases in a natural manner.
|
||||||
|
|
||||||
|
|
@ -1224,7 +1224,7 @@ The size of the bool type is one byte.
|
||||||
Character type
|
Character type
|
||||||
--------------
|
--------------
|
||||||
The character type is named `char` in Nim. Its size is one byte.
|
The character type is named `char` in Nim. Its size is one byte.
|
||||||
Thus it cannot represent a UTF-8 character, but a part of it.
|
Thus, it cannot represent a UTF-8 character, but a part of it.
|
||||||
|
|
||||||
The `Rune` type is used for Unicode characters, it can represent any Unicode
|
The `Rune` type is used for Unicode characters, it can represent any Unicode
|
||||||
character. `Rune` is declared in the `unicode module <unicode.html>`_.
|
character. `Rune` is declared in the `unicode module <unicode.html>`_.
|
||||||
|
|
@ -1255,7 +1255,7 @@ Now the following holds::
|
||||||
ord(Direction.west) == 3
|
ord(Direction.west) == 3
|
||||||
|
|
||||||
The implied order is: north < east < south < west. The comparison operators can be used
|
The implied order is: north < east < south < west. The comparison operators can be used
|
||||||
with enumeration types. Instead of `north` etc, the enum value can also
|
with enumeration types. Instead of `north` etc., the enum value can also
|
||||||
be qualified with the enum type that it resides in, `Direction.north`.
|
be qualified with the enum type that it resides in, `Direction.north`.
|
||||||
|
|
||||||
For better interfacing to other programming languages, the fields of enum
|
For better interfacing to other programming languages, the fields of enum
|
||||||
|
|
@ -1405,7 +1405,7 @@ memory. For this reason, the implicit conversion will be removed in future
|
||||||
releases of the Nim compiler. Certain idioms like conversion of a `const` string
|
releases of the Nim compiler. Certain idioms like conversion of a `const` string
|
||||||
to `cstring` are safe and will remain to be allowed.
|
to `cstring` are safe and will remain to be allowed.
|
||||||
|
|
||||||
A `$` proc is defined for cstrings that returns a string. Thus to get a nim
|
A `$` proc is defined for cstrings that returns a string. Thus, to get a nim
|
||||||
string from a cstring:
|
string from a cstring:
|
||||||
|
|
||||||
```nim
|
```nim
|
||||||
|
|
@ -1911,7 +1911,7 @@ point to and modify the same location in memory (also called `aliasing`:idx:).
|
||||||
Nim distinguishes between `traced`:idx: and `untraced`:idx: references.
|
Nim distinguishes between `traced`:idx: and `untraced`:idx: references.
|
||||||
Untraced references are also called *pointers*. Traced references point to
|
Untraced references are also called *pointers*. Traced references point to
|
||||||
objects of a garbage-collected heap, untraced references point to
|
objects of a garbage-collected heap, untraced references point to
|
||||||
manually allocated objects or objects somewhere else in memory. Thus
|
manually allocated objects or objects somewhere else in memory. Thus,
|
||||||
untraced references are *unsafe*. However, for certain low-level operations
|
untraced references are *unsafe*. However, for certain low-level operations
|
||||||
(accessing the hardware) untraced references are unavoidable.
|
(accessing the hardware) untraced references are unavoidable.
|
||||||
|
|
||||||
|
|
@ -1922,7 +1922,7 @@ convertible to the `pointer` type.
|
||||||
An empty subscript `[]` notation can be used to de-refer a reference,
|
An empty subscript `[]` notation can be used to de-refer a reference,
|
||||||
the `addr` procedure returns the address of an item. An address is always
|
the `addr` procedure returns the address of an item. An address is always
|
||||||
an untraced reference.
|
an untraced reference.
|
||||||
Thus the usage of `addr` is an *unsafe* feature.
|
Thus, the usage of `addr` is an *unsafe* feature.
|
||||||
|
|
||||||
The `.` (access a tuple/object field operator)
|
The `.` (access a tuple/object field operator)
|
||||||
and `[]` (array/string/sequence index operator) operators perform implicit
|
and `[]` (array/string/sequence index operator) operators perform implicit
|
||||||
|
|
@ -2119,7 +2119,7 @@ Nim supports these `calling conventions`:idx:\:
|
||||||
The inline convention means the caller should not call the procedure,
|
The inline convention means the caller should not call the procedure,
|
||||||
but inline its code directly. Note that Nim does not inline, but leaves
|
but inline its code directly. Note that Nim does not inline, but leaves
|
||||||
this to the C compiler; it generates `__inline` procedures. This is
|
this to the C compiler; it generates `__inline` procedures. This is
|
||||||
only a hint for the compiler: it may completely ignore it and
|
only a hint for the compiler: it may completely ignore it, and
|
||||||
it may inline procedures that are not marked as `inline`.
|
it may inline procedures that are not marked as `inline`.
|
||||||
|
|
||||||
`fastcall`:idx:
|
`fastcall`:idx:
|
||||||
|
|
@ -2902,7 +2902,7 @@ the variable has been initialized and does not rely on syntactic properties:
|
||||||
# use x
|
# use x
|
||||||
```
|
```
|
||||||
|
|
||||||
`requiresInit` pragma can also be applyied to `distinct` types.
|
`requiresInit` pragma can also be applied to `distinct` types.
|
||||||
|
|
||||||
Given the following distinct type definitions:
|
Given the following distinct type definitions:
|
||||||
|
|
||||||
|
|
@ -2929,7 +2929,7 @@ The following code blocks will fail to compile:
|
||||||
doAssert string(s) == "test"
|
doAssert string(s) == "test"
|
||||||
```
|
```
|
||||||
|
|
||||||
But these ones will compile successfully:
|
But these will compile successfully:
|
||||||
|
|
||||||
```nim
|
```nim
|
||||||
let foo = DistinctFoo(Foo(x: "test"))
|
let foo = DistinctFoo(Foo(x: "test"))
|
||||||
|
|
@ -3039,7 +3039,7 @@ Example:
|
||||||
|
|
||||||
The `if` statement is a simple way to make a branch in the control flow:
|
The `if` statement is a simple way to make a branch in the control flow:
|
||||||
The expression after the keyword `if` is evaluated, if it is true
|
The expression after the keyword `if` is evaluated, if it is true
|
||||||
the corresponding statements after the `:` are executed. Otherwise
|
the corresponding statements after the `:` are executed. Otherwise,
|
||||||
the expression after the `elif` is evaluated (if there is an
|
the expression after the `elif` is evaluated (if there is an
|
||||||
`elif` branch), if it is true the corresponding statements after
|
`elif` branch), if it is true the corresponding statements after
|
||||||
the `:` are executed. This goes on until the last `elif`. If all
|
the `:` are executed. This goes on until the last `elif`. If all
|
||||||
|
|
@ -3583,7 +3583,7 @@ that is a type class (which is non-concrete) would be invalid:
|
||||||
|
|
||||||
Type casts should not be confused with *type conversions,* as mentioned in the
|
Type casts should not be confused with *type conversions,* as mentioned in the
|
||||||
prior section. Unlike type conversions, a type cast cannot change the underlying
|
prior section. Unlike type conversions, a type cast cannot change the underlying
|
||||||
bit pattern of the data being casted (aside from that the size of the target type
|
bit pattern of the data being cast (aside from that the size of the target type
|
||||||
may differ from the source type). Casting resembles *type punning* in other
|
may differ from the source type). Casting resembles *type punning* in other
|
||||||
languages or C++'s `reinterpret_cast`:cpp: and `bit_cast`:cpp: features.
|
languages or C++'s `reinterpret_cast`:cpp: and `bit_cast`:cpp: features.
|
||||||
|
|
||||||
|
|
@ -3673,8 +3673,8 @@ arguments, by using the type modifier `var`.
|
||||||
outp = inp + 47
|
outp = inp + 47
|
||||||
```
|
```
|
||||||
|
|
||||||
If the proc declaration has no body, it is a `forward`:idx: declaration. If the
|
If the proc declaration doesn't have a body, it is a `forward`:idx: declaration.
|
||||||
proc returns a value, the procedure body can access an implicitly declared
|
If the proc returns a value, the procedure body can access an implicitly declared
|
||||||
variable named `result`:idx: that represents the return value. Procs can be
|
variable named `result`:idx: that represents the return value. Procs can be
|
||||||
overloaded. The overloading resolution algorithm determines which proc is the
|
overloaded. The overloading resolution algorithm determines which proc is the
|
||||||
best match for the arguments. Example:
|
best match for the arguments. Example:
|
||||||
|
|
@ -3692,7 +3692,7 @@ best match for the arguments. Example:
|
||||||
result[i] = toLower(s[i]) # calls toLower for characters; no recursion!
|
result[i] = toLower(s[i]) # calls toLower for characters; no recursion!
|
||||||
```
|
```
|
||||||
|
|
||||||
Calling a procedure can be done in many different ways:
|
Calling a procedure can be done in many ways:
|
||||||
|
|
||||||
```nim
|
```nim
|
||||||
proc callme(x, y: int, s: string = "", c: char, b: bool = false) = ...
|
proc callme(x, y: int, s: string = "", c: char, b: bool = false) = ...
|
||||||
|
|
@ -4029,7 +4029,7 @@ simplicity (they require specialized semantic checking)::
|
||||||
declared, defined, definedInScope, compiles, sizeof,
|
declared, defined, definedInScope, compiles, sizeof,
|
||||||
is, shallowCopy, getAst, astToStr, spawn, procCall
|
is, shallowCopy, getAst, astToStr, spawn, procCall
|
||||||
|
|
||||||
Thus they act more like keywords than like ordinary identifiers; unlike a
|
Thus, they act more like keywords than like ordinary identifiers; unlike a
|
||||||
keyword however, a redefinition may `shadow`:idx: the definition in
|
keyword however, a redefinition may `shadow`:idx: the definition in
|
||||||
the system_ module. From this list the following should not be written in dot
|
the system_ module. From this list the following should not be written in dot
|
||||||
notation `x.f` since `x` cannot be type-checked before it gets passed
|
notation `x.f` since `x` cannot be type-checked before it gets passed
|
||||||
|
|
@ -4367,7 +4367,7 @@ state are automatically saved between calls. Example:
|
||||||
echo ch
|
echo ch
|
||||||
```
|
```
|
||||||
|
|
||||||
The compiler generates code as if the programmer would have written this:
|
The compiler generates code as if the programmer had written this:
|
||||||
|
|
||||||
```nim
|
```nim
|
||||||
var i = 0
|
var i = 0
|
||||||
|
|
@ -4387,7 +4387,7 @@ Implicit items/pairs invocations
|
||||||
|
|
||||||
If the for loop expression `e` does not denote an iterator and the for loop
|
If the for loop expression `e` does not denote an iterator and the for loop
|
||||||
has exactly 1 variable, the for loop expression is rewritten to `items(e)`;
|
has exactly 1 variable, the for loop expression is rewritten to `items(e)`;
|
||||||
ie. an `items` iterator is implicitly invoked:
|
i.e. an `items` iterator is implicitly invoked:
|
||||||
|
|
||||||
```nim
|
```nim
|
||||||
for x in [1,2,3]: echo x
|
for x in [1,2,3]: echo x
|
||||||
|
|
@ -4490,7 +4490,7 @@ The builtin `system.finished` can be used to determine if an iterator has
|
||||||
finished its operation; no exception is raised on an attempt to invoke an
|
finished its operation; no exception is raised on an attempt to invoke an
|
||||||
iterator that has already finished its work.
|
iterator that has already finished its work.
|
||||||
|
|
||||||
Note that `system.finished` is error prone to use because it only returns
|
Note that `system.finished` is error-prone to use because it only returns
|
||||||
`true` one iteration after the iterator has finished:
|
`true` one iteration after the iterator has finished:
|
||||||
|
|
||||||
```nim
|
```nim
|
||||||
|
|
@ -4511,7 +4511,7 @@ Note that `system.finished` is error prone to use because it only returns
|
||||||
0
|
0
|
||||||
```
|
```
|
||||||
|
|
||||||
Instead this code has to be used:
|
Instead, this code has to be used:
|
||||||
|
|
||||||
```nim
|
```nim
|
||||||
var c = mycount # instantiate the iterator
|
var c = mycount # instantiate the iterator
|
||||||
|
|
@ -4562,7 +4562,7 @@ The call can be made more like an inline iterator with a for loop macro:
|
||||||
echo f
|
echo f
|
||||||
```
|
```
|
||||||
|
|
||||||
Because of full backend function call aparatus involvment, closure iterator
|
Because of full backend function call apparatus involvement, closure iterator
|
||||||
invocation is typically higher cost than inline iterators. Adornment by
|
invocation is typically higher cost than inline iterators. Adornment by
|
||||||
a macro wrapper at the call site like this is a possibly useful reminder.
|
a macro wrapper at the call site like this is a possibly useful reminder.
|
||||||
|
|
||||||
|
|
@ -5052,7 +5052,7 @@ conservative in its effect analysis:
|
||||||
proc cmpE(a, b: MyInt): int {.raises: [Exception].} =
|
proc cmpE(a, b: MyInt): int {.raises: [Exception].} =
|
||||||
cmp(a.int, b.int)
|
cmp(a.int, b.int)
|
||||||
|
|
||||||
proc harmfull {.raises: [].} =
|
proc harmful {.raises: [].} =
|
||||||
# does not compile, `sort` can now raise Exception
|
# does not compile, `sort` can now raise Exception
|
||||||
toSort.sort cmpE
|
toSort.sort cmpE
|
||||||
```
|
```
|
||||||
|
|
@ -5921,7 +5921,7 @@ template parameter, it is an `inject`'ed symbol:
|
||||||
|
|
||||||
|
|
||||||
The `inject` and `gensym` pragmas are second class annotations; they have
|
The `inject` and `gensym` pragmas are second class annotations; they have
|
||||||
no semantics outside of a template definition and cannot be abstracted over:
|
no semantics outside a template definition and cannot be abstracted over:
|
||||||
|
|
||||||
```nim
|
```nim
|
||||||
{.pragma myInject: inject.}
|
{.pragma myInject: inject.}
|
||||||
|
|
@ -5972,7 +5972,7 @@ Limitations of the method call syntax
|
||||||
|
|
||||||
The expression `x` in `x.f` needs to be semantically checked (that means
|
The expression `x` in `x.f` needs to be semantically checked (that means
|
||||||
symbol lookup and type checking) before it can be decided that it needs to be
|
symbol lookup and type checking) before it can be decided that it needs to be
|
||||||
rewritten to `f(x)`. Therefore the dot syntax has some limitations when it
|
rewritten to `f(x)`. Therefore, the dot syntax has some limitations when it
|
||||||
is used to invoke templates/macros:
|
is used to invoke templates/macros:
|
||||||
|
|
||||||
```nim test = "nim c $1" status = 1
|
```nim test = "nim c $1" status = 1
|
||||||
|
|
@ -6456,7 +6456,7 @@ Modules
|
||||||
Nim supports splitting a program into pieces by a module concept.
|
Nim supports splitting a program into pieces by a module concept.
|
||||||
Each module needs to be in its own file and has its own `namespace`:idx:.
|
Each module needs to be in its own file and has its own `namespace`:idx:.
|
||||||
Modules enable `information hiding`:idx: and `separate compilation`:idx:.
|
Modules enable `information hiding`:idx: and `separate compilation`:idx:.
|
||||||
A module may gain access to symbols of another module by the `import`:idx:
|
A module may gain access to the symbols of another module by the `import`:idx:
|
||||||
statement. `Recursive module dependencies`:idx: are allowed, but are slightly
|
statement. `Recursive module dependencies`:idx: are allowed, but are slightly
|
||||||
subtle. Only top-level symbols that are marked with an asterisk (`*`) are
|
subtle. Only top-level symbols that are marked with an asterisk (`*`) are
|
||||||
exported. A valid module name can only be a valid Nim identifier (and thus its
|
exported. A valid module name can only be a valid Nim identifier (and thus its
|
||||||
|
|
@ -6529,7 +6529,7 @@ statement is useful to split up a large module into several files:
|
||||||
include fileA, fileB, fileC
|
include fileA, fileB, fileC
|
||||||
```
|
```
|
||||||
|
|
||||||
The `include` statement can be used outside of the top level, as such:
|
The `include` statement can be used outside the top level, as such:
|
||||||
|
|
||||||
```nim
|
```nim
|
||||||
# Module A
|
# Module A
|
||||||
|
|
@ -6564,8 +6564,8 @@ in subdirectories:
|
||||||
import lib/pure/os, "lib/pure/times"
|
import lib/pure/os, "lib/pure/times"
|
||||||
```
|
```
|
||||||
|
|
||||||
Note that the module name is still `strutils` and not `lib/pure/strutils`
|
Note that the module name is still `strutils` and not `lib/pure/strutils`,
|
||||||
and so one **cannot** do:
|
thus one **cannot** do:
|
||||||
|
|
||||||
```nim
|
```nim
|
||||||
import lib/pure/strutils
|
import lib/pure/strutils
|
||||||
|
|
@ -6614,7 +6614,7 @@ It is recommended and preferred but not currently enforced that all stdlib modul
|
||||||
From import statement
|
From import statement
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
After the `from` statement, a module name follows followed by
|
After the `from` statement, a module name followed by
|
||||||
an `import` to list the symbols one likes to use without explicit
|
an `import` to list the symbols one likes to use without explicit
|
||||||
full qualification:
|
full qualification:
|
||||||
|
|
||||||
|
|
@ -6964,7 +6964,7 @@ statement, as seen in stack backtraces:
|
||||||
raise newException(AssertionDefect, msg)
|
raise newException(AssertionDefect, msg)
|
||||||
```
|
```
|
||||||
|
|
||||||
If the `line` pragma is used with a parameter, the parameter needs be a
|
If the `line` pragma is used with a parameter, the parameter needs to be a
|
||||||
`tuple[filename: string, line: int]`. If it is used without a parameter,
|
`tuple[filename: string, line: int]`. If it is used without a parameter,
|
||||||
`system.instantiationInfo()` is used.
|
`system.instantiationInfo()` is used.
|
||||||
|
|
||||||
|
|
@ -6987,7 +6987,7 @@ statement:
|
||||||
```
|
```
|
||||||
|
|
||||||
In the example, the case branches `0` and `1` are much more common than
|
In the example, the case branches `0` and `1` are much more common than
|
||||||
the other cases. Therefore the generated assembler code should test for these
|
the other cases. Therefore, the generated assembler code should test for these
|
||||||
values first so that the CPU's branch predictor has a good chance to succeed
|
values first so that the CPU's branch predictor has a good chance to succeed
|
||||||
(avoiding an expensive CPU pipeline stall). The other cases might be put into a
|
(avoiding an expensive CPU pipeline stall). The other cases might be put into a
|
||||||
jump table for O(1) overhead but at the cost of a (very likely) pipeline
|
jump table for O(1) overhead but at the cost of a (very likely) pipeline
|
||||||
|
|
@ -7323,14 +7323,14 @@ restriction is violated, the backend optimizer is free to miscompile the code.
|
||||||
This is an **unsafe** language feature.
|
This is an **unsafe** language feature.
|
||||||
|
|
||||||
Ideally in later versions of the language, the restriction will be enforced at
|
Ideally in later versions of the language, the restriction will be enforced at
|
||||||
compile time. (This is also why the name `noalias` was choosen instead of a more
|
compile time. (This is also why the name `noalias` was chosen instead of a more
|
||||||
verbose name like `unsafeAssumeNoAlias`.)
|
verbose name like `unsafeAssumeNoAlias`.)
|
||||||
|
|
||||||
|
|
||||||
Volatile pragma
|
Volatile pragma
|
||||||
---------------
|
---------------
|
||||||
The `volatile` pragma is for variables only. It declares the variable as
|
The `volatile` pragma is for variables only. It declares the variable as
|
||||||
`volatile`:c:, whatever that means in C/C++ (its semantics are not well defined
|
`volatile`:c:, whatever that means in C/C++ (its semantics are not well-defined
|
||||||
in C/C++).
|
in C/C++).
|
||||||
|
|
||||||
**Note**: This pragma will not exist for the LLVM backend.
|
**Note**: This pragma will not exist for the LLVM backend.
|
||||||
|
|
@ -7421,7 +7421,7 @@ The `link` pragma can be used to link an additional file with the project:
|
||||||
passc pragma
|
passc pragma
|
||||||
------------
|
------------
|
||||||
The `passc` pragma can be used to pass additional parameters to the C
|
The `passc` pragma can be used to pass additional parameters to the C
|
||||||
compiler like one would using the command-line switch `--passc`:option:\:
|
compiler like one would use the command-line switch `--passc`:option:\:
|
||||||
|
|
||||||
```Nim
|
```Nim
|
||||||
{.passc: "-Wall -Werror".}
|
{.passc: "-Wall -Werror".}
|
||||||
|
|
@ -7976,7 +7976,7 @@ implementation:
|
||||||
user_id {.dbForeignKey: User.}: int
|
user_id {.dbForeignKey: User.}: int
|
||||||
read_access: bool
|
read_access: bool
|
||||||
write_access: bool
|
write_access: bool
|
||||||
admin_acess: bool
|
admin_access: bool
|
||||||
```
|
```
|
||||||
|
|
||||||
In this example, custom pragmas are used to describe how Nim objects are
|
In this example, custom pragmas are used to describe how Nim objects are
|
||||||
|
|
@ -8020,7 +8020,7 @@ Macro pragmas
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
Macros and templates can sometimes be called with the pragma syntax. Cases
|
Macros and templates can sometimes be called with the pragma syntax. Cases
|
||||||
where this is possible include when attached to routine (procs, iterators, etc)
|
where this is possible include when attached to routine (procs, iterators, etc.)
|
||||||
declarations or routine type expressions. The compiler will perform the
|
declarations or routine type expressions. The compiler will perform the
|
||||||
following simple syntactic transformations:
|
following simple syntactic transformations:
|
||||||
|
|
||||||
|
|
@ -8190,7 +8190,7 @@ strings automatically:
|
||||||
Union pragma
|
Union pragma
|
||||||
------------
|
------------
|
||||||
The `union` pragma can be applied to any `object` type. It means all
|
The `union` pragma can be applied to any `object` type. It means all
|
||||||
of the object's fields are overlaid in memory. This produces a `union`:c:
|
of an object's fields are overlaid in memory. This produces a `union`:c:
|
||||||
instead of a `struct`:c: in the generated C/C++ code. The object declaration
|
instead of a `struct`:c: in the generated C/C++ code. The object declaration
|
||||||
then must not use inheritance or any GC'ed memory but this is currently not
|
then must not use inheritance or any GC'ed memory but this is currently not
|
||||||
checked.
|
checked.
|
||||||
|
|
@ -8435,7 +8435,7 @@ The guard then needs to be another field within the same object or a
|
||||||
global variable.
|
global variable.
|
||||||
|
|
||||||
Since objects can reside on the heap or on the stack, this greatly enhances
|
Since objects can reside on the heap or on the stack, this greatly enhances
|
||||||
the expressivity of the language:
|
the expressiveness of the language:
|
||||||
|
|
||||||
```nim
|
```nim
|
||||||
import std/locks
|
import std/locks
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,7 @@ You can annotate a type where nil isn't a valid value with `not nil`.
|
||||||
|
|
||||||
|
|
||||||
If a type can include `nil` as a valid value, dereferencing values of the type
|
If a type can include `nil` as a valid value, dereferencing values of the type
|
||||||
is checked by the compiler: if a value which might be nil is derefenced, this
|
is checked by the compiler: if a value which might be nil is dereferenced, this
|
||||||
produces a warning by default, you can turn this into an error using
|
produces a warning by default, you can turn this into an error using
|
||||||
the compiler options `--warningAsError:strictNotNil`:option:.
|
the compiler options `--warningAsError:strictNotNil`:option:.
|
||||||
|
|
||||||
|
|
@ -76,7 +76,7 @@ Note: test that/TODO for code/manual.
|
||||||
nilability state
|
nilability state
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
Currently a nilable value can be `Safe`, `MaybeNil` or `Nil` : we use internally `Parent` and `Unreachable` but this is an implementation detail(a parent layer has the actual nilability).
|
Currently, a nilable value can be `Safe`, `MaybeNil` or `Nil` : we use internally `Parent` and `Unreachable` but this is an implementation detail(a parent layer has the actual nilability).
|
||||||
|
|
||||||
- `Safe` means it shouldn't be nil at that point: e.g. after assignment to
|
- `Safe` means it shouldn't be nil at that point: e.g. after assignment to
|
||||||
a non-nil value or `not a.isNil` check
|
a non-nil value or `not a.isNil` check
|
||||||
|
|
@ -87,7 +87,7 @@ Currently a nilable value can be `Safe`, `MaybeNil` or `Nil` : we use internally
|
||||||
- `Unreachable` means it shouldn't be possible to access this in this branch:
|
- `Unreachable` means it shouldn't be possible to access this in this branch:
|
||||||
so we do generate a warning as well.
|
so we do generate a warning as well.
|
||||||
|
|
||||||
We show an error for each dereference (`[]`, `.field`, `[index]` `()` etc) which is of a tracked expression which is
|
We show an error for each dereference (`[]`, `.field`, `[index]` `()` etc.) which is of a tracked expression which is
|
||||||
in `MaybeNil` or `Nil` state.
|
in `MaybeNil` or `Nil` state.
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -127,14 +127,14 @@ This is also a possible aliasing `move out` (moving out of a current alias set).
|
||||||
.. code-block:: nim
|
.. code-block:: nim
|
||||||
call(a)
|
call(a)
|
||||||
|
|
||||||
Here `call` can change a field or element of `a`, so if we have a dependant expression of `a` : e.g. `a.field`. Dependats become `MaybeNil`.
|
Here `call` can change a field or element of `a`, so if we have a dependant expression of `a` : e.g. `a.field`. Dependants become `MaybeNil`.
|
||||||
|
|
||||||
|
|
||||||
branches rules
|
branches rules
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
Branches are the reason we do nil checking like this: with flow checking.
|
Branches are the reason we do nil checking like this: with flow checking.
|
||||||
Sources of brancing are `if`, `while`, `for`, `and`, `or`, `case`, `try` and combinations with `return`, `break`, `continue` and `raise`
|
Sources of branching are `if`, `while`, `for`, `and`, `or`, `case`, `try` and combinations with `return`, `break`, `continue` and `raise`
|
||||||
|
|
||||||
We create a new layer/"scope" for each branch where we map expressions to nilability. This happens when we "fork": usually on the beginning of a construct.
|
We create a new layer/"scope" for each branch where we map expressions to nilability. This happens when we "fork": usually on the beginning of a construct.
|
||||||
When branches "join" we usually unify their expression maps or/and nilabilities.
|
When branches "join" we usually unify their expression maps or/and nilabilities.
|
||||||
|
|
@ -164,7 +164,7 @@ We want to track also field(dot) and index(bracket) expressions.
|
||||||
We track some of those compound expressions which might be nilable as dependants of their bases: `a.field` is changed if `a` is moved (re-assigned),
|
We track some of those compound expressions which might be nilable as dependants of their bases: `a.field` is changed if `a` is moved (re-assigned),
|
||||||
similarly `a[index]` is dependent on `a` and `a.field.field` on `a.field`.
|
similarly `a[index]` is dependent on `a` and `a.field.field` on `a.field`.
|
||||||
|
|
||||||
When we move the base, we update dependants to `MaybeNil`. Otherwise we usually start with type nilability.
|
When we move the base, we update dependants to `MaybeNil`. Otherwise, we usually start with type nilability.
|
||||||
|
|
||||||
When we call args, we update the nilability of their dependants to `MaybeNil` as the calls usually can change them.
|
When we call args, we update the nilability of their dependants to `MaybeNil` as the calls usually can change them.
|
||||||
We might need to check for `strictFuncs` pure funcs and not do that then.
|
We might need to check for `strictFuncs` pure funcs and not do that then.
|
||||||
|
|
@ -172,10 +172,10 @@ We might need to check for `strictFuncs` pure funcs and not do that then.
|
||||||
For field expressions `a.field`, we calculate an integer value based on a hash of the tree and just accept equivalent trees as equivalent expressions.
|
For field expressions `a.field`, we calculate an integer value based on a hash of the tree and just accept equivalent trees as equivalent expressions.
|
||||||
|
|
||||||
For item expression `a[index]`, we also calculate an integer value based on a hash of the tree and accept equivalent trees as equivalent expressions: for static values only.
|
For item expression `a[index]`, we also calculate an integer value based on a hash of the tree and accept equivalent trees as equivalent expressions: for static values only.
|
||||||
For now we support only constant indices: we dont track expression with no-const indices. For those we just report a warning even if they are safe for now: one can use a local variable to workaround. For loops this might be annoying: so one should be able to turn off locally the warning using the `{.warning[StrictNotNil]:off.}`.
|
For now, we support only constant indices: we don't track expression with no-const indices. For those we just report a warning even if they are safe for now: one can use a local variable to workaround. For loops this might be annoying: so one should be able to turn off locally the warning using the `{.warning[StrictNotNil]:off.}`.
|
||||||
|
|
||||||
For bracket expressions, in the future we might count `a[<any>]` as the same general expression.
|
For bracket expressions, in the future we might count `a[<any>]` as the same general expression.
|
||||||
This means we should should the index but otherwise handle it the same for assign (maybe "aliasing" all the non-static elements) and differentiate only for static: e.g. `a[0]` and `a[1]`.
|
This means we should the index but otherwise handle it the same for assign (maybe "aliasing" all the non-static elements) and differentiate only for static: e.g. `a[0]` and `a[1]`.
|
||||||
|
|
||||||
element tracking
|
element tracking
|
||||||
-----------------
|
-----------------
|
||||||
|
|
@ -193,7 +193,7 @@ unstructured control flow rules
|
||||||
-------------------------------
|
-------------------------------
|
||||||
|
|
||||||
Unstructured control flow keywords as `return`, `break`, `continue`, `raise` mean that we jump from a branch out.
|
Unstructured control flow keywords as `return`, `break`, `continue`, `raise` mean that we jump from a branch out.
|
||||||
This means that if there is code after the finishing of the branch, it would be ran if one hasn't hit the direct parent branch of those: so it is similar to an `else`. In those cases we should use the reverse nilabilities for the local to the condition expressions. E.g.
|
This means that if there is code after the finishing of the branch, it would be run if one hasn't hit the direct parent branch of those: so it is similar to an `else`. In those cases we should use the reverse nilabilities for the local to the condition expressions. E.g.
|
||||||
|
|
||||||
.. code-block:: nim
|
.. code-block:: nim
|
||||||
for a in c:
|
for a in c:
|
||||||
|
|
@ -235,7 +235,7 @@ TODO
|
||||||
warnings and errors
|
warnings and errors
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
We show an error for each dereference (`[]`, `.field`, `[index]` `()` etc) which is of a tracked expression which is
|
We show an error for each dereference (`[]`, `.field`, `[index]` `()` etc.) which is of a tracked expression which is
|
||||||
in `MaybeNil` or `Nil` state.
|
in `MaybeNil` or `Nil` state.
|
||||||
|
|
||||||
We might also show a history of the transitions and the reasons for them that might change the nilability of the expression.
|
We might also show a history of the transitions and the reasons for them that might change the nilability of the expression.
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ Positional arguments, from left to right:
|
||||||
|
|
||||||
|
|
||||||
For any given DIRECTORY nimgrep searches only its immediate files without
|
For any given DIRECTORY nimgrep searches only its immediate files without
|
||||||
traversing sub-directories unless `--recursive` is specified.
|
traversing subdirectories unless `--recursive` is specified.
|
||||||
|
|
||||||
In replacement mode we require all 3 positional arguments to avoid damaging.
|
In replacement mode we require all 3 positional arguments to avoid damaging.
|
||||||
|
|
||||||
|
|
@ -47,15 +47,15 @@ Options:
|
||||||
nimgrep --filenames "" DIRECTORY
|
nimgrep --filenames "" DIRECTORY
|
||||||
# Note empty pattern "", lists all files in DIRECTORY
|
# Note empty pattern "", lists all files in DIRECTORY
|
||||||
|
|
||||||
* Interprete patterns:
|
* Interpret patterns:
|
||||||
--peg PATTERN and PAT are Peg
|
--peg PATTERN and PAT are Peg
|
||||||
--re PATTERN and PAT are regular expressions (default)
|
--re PATTERN and PAT are regular expressions (default)
|
||||||
--rex, -x use the "extended" syntax for the regular expression
|
--rex, -x use the "extended" syntax for the regular expression
|
||||||
so that whitespace is not significant
|
so that whitespace is not significant
|
||||||
--word, -w matches should have word boundaries (buggy for pegs!)
|
--word, -w matches should have word boundaries (buggy for pegs!)
|
||||||
--ignoreCase, -i be case insensitive in PATTERN and PAT
|
--ignoreCase, -i be case-insensitive in PATTERN and PAT
|
||||||
--ignoreStyle, -y be style insensitive in PATTERN and PAT
|
--ignoreStyle, -y be style insensitive in PATTERN and PAT
|
||||||
.. Note:: PATERN and patterns PAT (see below in other options) are all either
|
.. Note:: PATTERN and patterns PAT (see below in other options) are all either
|
||||||
Regex or Peg simultaneously and options `--rex`, `--word`, `--ignoreCase`,
|
Regex or Peg simultaneously and options `--rex`, `--word`, `--ignoreCase`,
|
||||||
and `--ignoreStyle` are applied to all of them.
|
and `--ignoreStyle` are applied to all of them.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,12 +13,12 @@ notation meaning
|
||||||
``A / ... / Z`` Ordered choice: Apply expressions `A`, ..., `Z`, in this
|
``A / ... / Z`` Ordered choice: Apply expressions `A`, ..., `Z`, in this
|
||||||
order, to the text ahead, until one of them succeeds and
|
order, to the text ahead, until one of them succeeds and
|
||||||
possibly consumes some text. Indicate success if one of
|
possibly consumes some text. Indicate success if one of
|
||||||
expressions succeeded. Otherwise do not consume any text
|
expressions succeeded. Otherwise, do not consume any text
|
||||||
and indicate failure.
|
and indicate failure.
|
||||||
``A ... Z`` Sequence: Apply expressions `A`, ..., `Z`, in this order,
|
``A ... Z`` Sequence: Apply expressions `A`, ..., `Z`, in this order,
|
||||||
to consume consecutive portions of the text ahead, as long
|
to consume consecutive portions of the text ahead, as long
|
||||||
as they succeed. Indicate success if all succeeded.
|
as they succeed. Indicate success if all succeeded.
|
||||||
Otherwise do not consume any text and indicate failure.
|
Otherwise, do not consume any text and indicate failure.
|
||||||
The sequence's precedence is higher than that of ordered
|
The sequence's precedence is higher than that of ordered
|
||||||
choice: ``A B / C`` means ``(A B) / Z`` and
|
choice: ``A B / C`` means ``(A B) / Z`` and
|
||||||
not ``A (B / Z)``.
|
not ``A (B / Z)``.
|
||||||
|
|
@ -44,20 +44,20 @@ notation meaning
|
||||||
``E+`` One or more: Apply expression `E` repeatedly to match
|
``E+`` One or more: Apply expression `E` repeatedly to match
|
||||||
the text ahead, as long as it succeeds. Consume the matched
|
the text ahead, as long as it succeeds. Consume the matched
|
||||||
text (if any) and indicate success if there was at least
|
text (if any) and indicate success if there was at least
|
||||||
one match. Otherwise indicate failure.
|
one match. Otherwise, indicate failure.
|
||||||
``E*`` Zero or more: Apply expression `E` repeatedly to match
|
``E*`` Zero or more: Apply expression `E` repeatedly to match
|
||||||
the text ahead, as long as it succeeds. Consume the matched
|
the text ahead, as long as it succeeds. Consume the matched
|
||||||
text (if any). Always indicate success.
|
text (if any). Always indicate success.
|
||||||
``E?`` Zero or one: If expression `E` matches the text ahead,
|
``E?`` Zero or one: If expression `E` matches the text ahead,
|
||||||
consume it. Always indicate success.
|
consume it. Always indicate success.
|
||||||
``[s]`` Character class: If the character ahead appears in the
|
``[s]`` Character class: If the character ahead appears in the
|
||||||
string `s`, consume it and indicate success. Otherwise
|
string `s`, consume it and indicate success. Otherwise,
|
||||||
indicate failure.
|
indicate failure.
|
||||||
``[a-b]`` Character range: If the character ahead is one from the
|
``[a-b]`` Character range: If the character ahead is one from the
|
||||||
range `a` through `b`, consume it and indicate success.
|
range `a` through `b`, consume it and indicate success.
|
||||||
Otherwise indicate failure.
|
Otherwise, indicate failure.
|
||||||
``'s'`` String: If the text ahead is the string `s`, consume it
|
``'s'`` String: If the text ahead is the string `s`, consume it
|
||||||
and indicate success. Otherwise indicate failure.
|
and indicate success. Otherwise, indicate failure.
|
||||||
``i's'`` String match ignoring case.
|
``i's'`` String match ignoring case.
|
||||||
``y's'`` String match ignoring style.
|
``y's'`` String match ignoring style.
|
||||||
``v's'`` Verbatim string match: Use this to override a global
|
``v's'`` Verbatim string match: Use this to override a global
|
||||||
|
|
@ -66,15 +66,15 @@ notation meaning
|
||||||
``y$j`` String match ignoring style for back reference.
|
``y$j`` String match ignoring style for back reference.
|
||||||
``v$j`` Verbatim string match for back reference.
|
``v$j`` Verbatim string match for back reference.
|
||||||
``.`` Any character: If there is a character ahead, consume it
|
``.`` Any character: If there is a character ahead, consume it
|
||||||
and indicate success. Otherwise (that is, at the end of
|
and indicate success. Otherwise, (that is, at the end of
|
||||||
input) indicate failure.
|
input) indicate failure.
|
||||||
``_`` Any Unicode character: If there is an UTF-8 character
|
``_`` Any Unicode character: If there is a UTF-8 character
|
||||||
ahead, consume it and indicate success. Otherwise indicate
|
ahead, consume it and indicate success. Otherwise, indicate
|
||||||
failure.
|
failure.
|
||||||
``@E`` Search: Shorthand for ``(!E .)* E``. (Search loop for the
|
``@E`` Search: Shorthand for ``(!E .)* E``. (Search loop for the
|
||||||
pattern `E`.)
|
pattern `E`.)
|
||||||
``{@} E`` Captured Search: Shorthand for ``{(!E .)*} E``. (Search
|
``{@} E`` Captured Search: Shorthand for ``{(!E .)*} E``. (Search
|
||||||
loop for the pattern `E`.) Everything until and exluding
|
loop for the pattern `E`.) Everything until and excluding
|
||||||
`E` is captured.
|
`E` is captured.
|
||||||
``@@ E`` Same as ``{@} E``.
|
``@@ E`` Same as ``{@} E``.
|
||||||
``A <- E`` Rule: Bind the expression `E` to the *nonterminal symbol*
|
``A <- E`` Rule: Bind the expression `E` to the *nonterminal symbol*
|
||||||
|
|
@ -82,7 +82,7 @@ notation meaning
|
||||||
matching engine.**
|
matching engine.**
|
||||||
``\identifier`` Built-in macro for a longer expression.
|
``\identifier`` Built-in macro for a longer expression.
|
||||||
``\ddd`` Character with decimal code *ddd*.
|
``\ddd`` Character with decimal code *ddd*.
|
||||||
``\"``, etc Literal ``"``, etc.
|
``\"``, etc. Literal ``"``, etc.
|
||||||
=============== ============================================================
|
=============== ============================================================
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
============================
|
============================
|
||||||
Nim's documenation system
|
Nim's documentation system
|
||||||
============================
|
============================
|
||||||
|
|
||||||
This folder contains Nim's documentation. The documentation
|
This folder contains Nim's documentation. The documentation
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
Testament is an advanced automatic unittests runner for Nim tests, is used for the development of Nim itself,
|
Testament is an advanced automatic unittests runner for Nim tests, is used for the development of Nim itself,
|
||||||
offers process isolation for your tests, it can generate statistics about test cases,
|
offers process isolation for your tests, it can generate statistics about test cases,
|
||||||
supports multiple targets (C, C++, ObjectiveC, JavaScript, etc),
|
supports multiple targets (C, C++, ObjectiveC, JavaScript, etc.),
|
||||||
simulated `Dry-Runs <https://en.wikipedia.org/wiki/Dry_run_(testing)>`_,
|
simulated `Dry-Runs <https://en.wikipedia.org/wiki/Dry_run_(testing)>`_,
|
||||||
has logging, can generate HTML reports, skip tests from a file, and more,
|
has logging, can generate HTML reports, skip tests from a file, and more,
|
||||||
so can be useful to run your tests, even the most complex ones.
|
so can be useful to run your tests, even the most complex ones.
|
||||||
|
|
@ -17,7 +17,7 @@ so can be useful to run your tests, even the most complex ones.
|
||||||
Test files location
|
Test files location
|
||||||
===================
|
===================
|
||||||
|
|
||||||
By default Testament looks for test files on ``"./tests/*.nim"``.
|
By default, Testament looks for test files on ``"./tests/*.nim"``.
|
||||||
You can overwrite this pattern glob using `pattern <glob>`:option:.
|
You can overwrite this pattern glob using `pattern <glob>`:option:.
|
||||||
The default working directory path can be changed using
|
The default working directory path can be changed using
|
||||||
`--directory:"folder/subfolder/"`:option:.
|
`--directory:"folder/subfolder/"`:option:.
|
||||||
|
|
@ -42,7 +42,7 @@ Options
|
||||||
or doing anything else.
|
or doing anything else.
|
||||||
--colors:on|off Turn messages coloring on|off.
|
--colors:on|off Turn messages coloring on|off.
|
||||||
--backendLogging:on|off Disable or enable backend logging.
|
--backendLogging:on|off Disable or enable backend logging.
|
||||||
By default turned on.
|
By default, turned on.
|
||||||
--skipFrom:file Read tests to skip from ``file`` - one test per
|
--skipFrom:file Read tests to skip from ``file`` - one test per
|
||||||
line, # comments ignored
|
line, # comments ignored
|
||||||
|
|
||||||
|
|
@ -88,8 +88,8 @@ you have to run at least 1 test *before* generating a report:
|
||||||
$ testament html
|
$ testament html
|
||||||
|
|
||||||
|
|
||||||
Writing Unitests
|
Writing Unit tests
|
||||||
================
|
==================
|
||||||
|
|
||||||
Example "template" **to edit** and write a Testament unittest:
|
Example "template" **to edit** and write a Testament unittest:
|
||||||
|
|
||||||
|
|
@ -112,7 +112,7 @@ Example "template" **to edit** and write a Testament unittest:
|
||||||
exitcode: 0
|
exitcode: 0
|
||||||
|
|
||||||
# Provide an `output` string to assert that the test prints to standard out
|
# Provide an `output` string to assert that the test prints to standard out
|
||||||
# exatly the expected string. Provide an `outputsub` string to assert that
|
# exactly the expected string. Provide an `outputsub` string to assert that
|
||||||
# the string given here is a substring of the standard out output of the
|
# the string given here is a substring of the standard out output of the
|
||||||
# test.
|
# test.
|
||||||
output: ""
|
output: ""
|
||||||
|
|
@ -139,7 +139,7 @@ Example "template" **to edit** and write a Testament unittest:
|
||||||
# Can be run in batch mode, or not.
|
# Can be run in batch mode, or not.
|
||||||
batchable: true
|
batchable: true
|
||||||
|
|
||||||
# Can be run Joined with other tests to run all togheter, or not.
|
# Can be run Joined with other tests to run all together, or not.
|
||||||
joinable: true
|
joinable: true
|
||||||
|
|
||||||
# On Linux 64-bit machines, whether to use Valgrind to check for bad memory
|
# On Linux 64-bit machines, whether to use Valgrind to check for bad memory
|
||||||
|
|
@ -192,8 +192,8 @@ Example "template" **to edit** and write a Testament unittest:
|
||||||
* `Testament supports inlined error messages on Unittests, basically comments with the expected error directly on the code. <https://github.com/nim-lang/Nim/blob/9a110047cbe2826b1d4afe63e3a1f5a08422b73f/tests/effects/teffects1.nim>`_
|
* `Testament supports inlined error messages on Unittests, basically comments with the expected error directly on the code. <https://github.com/nim-lang/Nim/blob/9a110047cbe2826b1d4afe63e3a1f5a08422b73f/tests/effects/teffects1.nim>`_
|
||||||
|
|
||||||
|
|
||||||
Unitests Examples
|
Unit test Examples
|
||||||
=================
|
==================
|
||||||
|
|
||||||
Expected to fail:
|
Expected to fail:
|
||||||
|
|
||||||
|
|
|
||||||
26
doc/tut1.md
26
doc/tut1.md
|
|
@ -74,7 +74,7 @@ aiming for your debugging pleasure. With ``-d:release`` some checks are
|
||||||
|
|
||||||
For benchmarking or production code, use the ``-d:release`` switch.
|
For benchmarking or production code, use the ``-d:release`` switch.
|
||||||
For comparing the performance with unsafe languages like C, use the ``-d:danger`` switch
|
For comparing the performance with unsafe languages like C, use the ``-d:danger`` switch
|
||||||
in order to get meaningful, comparable results. Otherwise Nim might be handicapped
|
in order to get meaningful, comparable results. Otherwise, Nim might be handicapped
|
||||||
by checks that are **not even available** for C.
|
by checks that are **not even available** for C.
|
||||||
|
|
||||||
Though it should be pretty obvious what the program does, I will explain the
|
Though it should be pretty obvious what the program does, I will explain the
|
||||||
|
|
@ -290,8 +290,8 @@ characters.)
|
||||||
Case statement
|
Case statement
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
Another way to branch is provided by the case statement. A case statement is
|
Another way to branch is provided by the case statement. A case statement allows
|
||||||
a multi-branch:
|
for multiple branches:
|
||||||
|
|
||||||
.. code-block:: nim
|
.. code-block:: nim
|
||||||
:test: "nim c $1"
|
:test: "nim c $1"
|
||||||
|
|
@ -732,7 +732,7 @@ Named arguments
|
||||||
|
|
||||||
Often a procedure has many parameters and it is not clear in which order the
|
Often a procedure has many parameters and it is not clear in which order the
|
||||||
parameters appear. This is especially true for procedures that construct a
|
parameters appear. This is especially true for procedures that construct a
|
||||||
complex data type. Therefore the arguments to a procedure can be named, so
|
complex data type. Therefore, the arguments to a procedure can be named, so
|
||||||
that it is clear which argument belongs to which parameter:
|
that it is clear which argument belongs to which parameter:
|
||||||
|
|
||||||
.. code-block:: nim
|
.. code-block:: nim
|
||||||
|
|
@ -893,7 +893,7 @@ with `{.noSideEffects.}`. Functions can still change their mutable arguments
|
||||||
however, which are those marked as `var`, along with any `ref` objects.
|
however, which are those marked as `var`, along with any `ref` objects.
|
||||||
|
|
||||||
Unlike procedures, methods are dynamically dispatched. This sounds a bit
|
Unlike procedures, methods are dynamically dispatched. This sounds a bit
|
||||||
complicated, but it is a concept closely related to inheritance and object oriented
|
complicated, but it is a concept closely related to inheritance and object-oriented
|
||||||
programming. If you overload a procedure (two procedures with the same name but
|
programming. If you overload a procedure (two procedures with the same name but
|
||||||
of different types or with different sets of arguments are said to be overloaded), the procedure to use is determined
|
of different types or with different sets of arguments are said to be overloaded), the procedure to use is determined
|
||||||
at compile-time. Methods, on the other hand, depend on objects that inherit from
|
at compile-time. Methods, on the other hand, depend on objects that inherit from
|
||||||
|
|
@ -950,7 +950,7 @@ important differences:
|
||||||
However, you can also use a closure iterator to get a different set of
|
However, you can also use a closure iterator to get a different set of
|
||||||
restrictions. See `first-class iterators <manual.html#iterators-and-the-for-statement-firstminusclass-iterators>`_
|
restrictions. See `first-class iterators <manual.html#iterators-and-the-for-statement-firstminusclass-iterators>`_
|
||||||
for details. Iterators can have the same name and parameters as a proc since
|
for details. Iterators can have the same name and parameters as a proc since
|
||||||
essentially they have their own namespaces. Therefore it is common practice to
|
essentially they have their own namespaces. Therefore, it is common to
|
||||||
wrap iterators in procs of the same name which accumulate the result of the
|
wrap iterators in procs of the same name which accumulate the result of the
|
||||||
iterator and return it as a sequence, like `split` from the `strutils module
|
iterator and return it as a sequence, like `split` from the `strutils module
|
||||||
<strutils.html>`_.
|
<strutils.html>`_.
|
||||||
|
|
@ -966,8 +966,8 @@ Booleans
|
||||||
--------
|
--------
|
||||||
|
|
||||||
Nim's boolean type is called `bool` and consists of the two
|
Nim's boolean type is called `bool` and consists of the two
|
||||||
pre-defined values `true` and `false`. Conditions in while,
|
pre-defined values `true` and `false`. Conditions in `while`,
|
||||||
if, elif, and when statements must be of type bool.
|
`if`, `elif`, and `when` statements must be of type bool.
|
||||||
|
|
||||||
The operators `not, and, or, xor, <, <=, >, >=, !=, ==` are defined
|
The operators `not, and, or, xor, <, <=, >, >=, !=, ==` are defined
|
||||||
for the bool type. The `and` and `or` operators perform short-circuit
|
for the bool type. The `and` and `or` operators perform short-circuit
|
||||||
|
|
@ -985,7 +985,7 @@ Characters
|
||||||
|
|
||||||
The *character type* is called `char`. Its size is always one byte, so
|
The *character type* is called `char`. Its size is always one byte, so
|
||||||
it cannot represent most UTF-8 characters, but it *can* represent one of the bytes
|
it cannot represent most UTF-8 characters, but it *can* represent one of the bytes
|
||||||
that makes up a multi-byte UTF-8 character.
|
that makes up a multibyte UTF-8 character.
|
||||||
The reason for this is efficiency: for the overwhelming majority of use-cases,
|
The reason for this is efficiency: for the overwhelming majority of use-cases,
|
||||||
the resulting programs will still handle UTF-8 properly as UTF-8 was especially
|
the resulting programs will still handle UTF-8 properly as UTF-8 was especially
|
||||||
designed for this.
|
designed for this.
|
||||||
|
|
@ -1485,7 +1485,7 @@ slice's bounds can hold any value supported by
|
||||||
their type, but it is the proc using the slice object which defines what values
|
their type, but it is the proc using the slice object which defines what values
|
||||||
are accepted.
|
are accepted.
|
||||||
|
|
||||||
To understand some of the different ways of specifying the indices of
|
To understand the different ways of specifying the indices of
|
||||||
strings, arrays, sequences, etc., it must be remembered that Nim uses
|
strings, arrays, sequences, etc., it must be remembered that Nim uses
|
||||||
zero-based indices.
|
zero-based indices.
|
||||||
|
|
||||||
|
|
@ -1500,7 +1500,7 @@ indices are
|
||||||
^19 ^8 ^2 using ^ syntax
|
^19 ^8 ^2 using ^ syntax
|
||||||
|
|
||||||
where `b[0 .. ^1]` is equivalent to `b[0 .. b.len-1]` and `b[0 ..< b.len]`, and it
|
where `b[0 .. ^1]` is equivalent to `b[0 .. b.len-1]` and `b[0 ..< b.len]`, and it
|
||||||
can be seen that the `^1` provides a short-hand way of specifying the `b.len-1`. See
|
can be seen that the `^1` provides a shorthand way of specifying the `b.len-1`. See
|
||||||
the `backwards index operator <system.html#^.t%2Cint>`_.
|
the `backwards index operator <system.html#^.t%2Cint>`_.
|
||||||
|
|
||||||
In the above example, because the string ends in a period, to get the portion of the
|
In the above example, because the string ends in a period, to get the portion of the
|
||||||
|
|
@ -1685,7 +1685,7 @@ Tuple unpacking is also supported in for-loops:
|
||||||
echo i, c
|
echo i, c
|
||||||
# This will output: 0a; 1b; 2c
|
# This will output: 0a; 1b; 2c
|
||||||
|
|
||||||
Fields of tuples are always public, they don't need to be explicity
|
Fields of tuples are always public, they don't need to be explicitly
|
||||||
marked to be exported, unlike for example fields in an object type.
|
marked to be exported, unlike for example fields in an object type.
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1699,7 +1699,7 @@ point to and modify the same location in memory.
|
||||||
Nim distinguishes between `traced`:idx: and `untraced`:idx: references.
|
Nim distinguishes between `traced`:idx: and `untraced`:idx: references.
|
||||||
Untraced references are also called *pointers*. Traced references point to
|
Untraced references are also called *pointers*. Traced references point to
|
||||||
objects in a garbage-collected heap, untraced references point to
|
objects in a garbage-collected heap, untraced references point to
|
||||||
manually allocated objects or objects elsewhere in memory. Thus
|
manually allocated objects or objects elsewhere in memory. Thus,
|
||||||
untraced references are *unsafe*. However, for certain low-level operations
|
untraced references are *unsafe*. However, for certain low-level operations
|
||||||
(e.g. accessing the hardware), untraced references are necessary.
|
(e.g. accessing the hardware), untraced references are necessary.
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue