* I don't care about observable stores
* enforce explicit initializations
* cleaner code for the stdlib
* stdlib: use explicit initializations
* make tests green
* algorithm.nim: set result explicitly
* remove out parameters and bring the PR into a mergable state
* updated the changelog
* Error -> Defect for defects
The distinction between Error and Defect is subjective,
context-dependent and somewhat arbitrary, so when looking at an
exception, it's hard to guess what it is - this happens often when
looking at a `raises` list _without_ opening the corresponding
definition and digging through layers of inheritance.
With the help of a little consistency in naming, it's at least possible
to start disentangling the two error types and the standard lib can set
a good example here.
* make parsutils.parseBin generic and improve runnableExamples
* reimplement parseBin/Oct/Hex and improve runnableExamples
* update changelog.md file with parseBin/Oct/Hex and fix a typo
* clarify `parseHexInt`, `parseOctInt` docstring and exception msgs
* add `parseBinInt` based on `parseutil.parseBin` implementation
Adds a `parseBinInt`, which parses a binary integer string and returns
it as an integer. This is based on the implementation of
`parseutil.parseBin`, removing the unnecessary parts.
* add tests for all `parse(Hex|Oct|Bin)Int` procs
* replace `parse*Int` proc impls by call to parseutil procs
Replaces the `parse(Hex|Oct|Bin)Int` procedure implementation by calls
to the `parseutil` procs, which receive a mutable argument.
Has the main advantage that the empty string as well as a "prefix
only" string, e.g. "0x" counts as an invalid integer.
Also moves the `parseOctInt` proc further up in the file so that all
`parse` procs are below one another.
* replace `var L` by `let L` in `parse` procs
There's no reason for the usage of `var` here.
* add `maxLen` optional arg for `parseutil.parse(Oct|Bin)`
Plus small change to test cases.
* update changelog about `parse*Int` procs
* fix `rejectParse` template in `tstrutils`
* make sure only `s.len` chars are parsed, if `maxLen+start` > s.len
Fixes a previous bug in `parseHex` (and now affected `parseOct` and
`parseBin`), which allowed to set `start + maxLen` to be larger than
the strings length. This resulted in an out of bounds access.
* move `parse*Int` proc change to breaking changes, add double `
Float literals were not parsed properly when their fractional part
exceeded 53 significant bits. This affected in particular math.PI
and math.E. Rather than reinventing the wheel, this patch reuses
C's strtod() implementation, which already does the heavy lifting
with respect to correctness, though some caution is necessary to
keep float parsing locale-independent.