# Version 0.8.14 released

### 2012年02月09日 Andreas Rumpf

Version 0.8.14 has been released!

## Bugfixes

- Fixed a serious memory corruption concerning message passing.
- Fixed a serious bug concerning different instantiations of a generic proc.
- Fixed a newly introduced bug where a wrong `EIO` exception was raised for the end of file for text files that do not end with a newline.
- Bugfix c2nim, c2pas: the `--out` option has never worked properly.
- Bugfix: forwarding of generic procs never worked.
- Some more bugfixes for macros and compile-time evaluation.
- The GC now takes into account interior pointers on the stack which may be introduced by aggressive C optimizers.
- Nimrod’s native allocator/GC now works on PowerPC.
- Lots of other bugfixes: Too many to list them all.

## Changes affecting backwards compatibility

- Removed deprecated `os.AppendFileExt`, `os.executeShellCommand`, `os.iterOverEnvironment`, `os.pcDirectory`, `os.pcLinkToDirectory`, `os.SplitPath`, `os.extractDir`, `os.SplitFilename`, `os.extractFileTrunk`, `os.extractFileExt`, `osproc.executeProcess`, `osproc.executeCommand`.
- Removed deprecated `parseopt.init`, `parseopt.getRestOfCommandLine`.
- Moved `strutils.validEmailAddress` to `matchers.validEmailAddress`.
- The pointer dereference operator `^` has been removed, so that `^` can now be a user-defined operator.
- `implies` is no keyword anymore.
- The `is` operator is now the `of` operator.
- The `is` operator is now used to check type equivalence in generic code.
- The `pure` pragma for procs has been renamed to `noStackFrame`.
- The threading API has been completely redesigned.
- The `unidecode` module is now thread-safe and its interface has changed.
- The `bind` expression is deprecated, use a `bind` declaration instead.
- `system.raiseHook` is now split into `system.localRaiseHook` and `system.globalRaiseHook` to distinguish between thread local and global raise hooks.
- Changed exception handling/error reporting for `os.removeFile` and `os.removeDir`.
- The algorithm for searching and loading configuration files has been changed.
- Operators now have diffent precedence rules: Assignment-like operators (like `*=`) are now special-cased.
- The fields in `TStream` have been renamed to have an `Impl` suffix because they should not be used directly anymore. Wrapper procs have been created that should be used instead.
- `export` is now a keyword.
- `assert` is now implemented in pure Nimrod as a template; it’s easy to implement your own assertion templates with `system.astToStr`.

## Language Additions

- Added new `is` and `of` operators.
- The built-in type `void` can be used to denote the absence of any type. This is useful in generic code.
- Return types may be of the type `var T` to return an l-value.
- The error pragma can now be used to mark symbols whose usage should trigger a compile-time error.
- There is a new `discardable` pragma that can be used to mark a routine so that its result can be discarded implicitly.
- Added a new `noinit` pragma to prevent automatic initialization to zero of variables.
- Constants can now have the type `seq`.
- There is a new user-definable syntactic construct `a{i, ...}` that has no semantics yet for built-in types and so can be overloaded to your heart’s content.
- `bind` (used for symbol binding in templates and generics) is now a declarative statement.
- Nimrod now supports single assignment variables via the `let` statement.
- Iterators named `items` and `pairs` are implicitly invoked when an explicit iterator is missing.
- The slice assignment `a[i..j] = b` where `a` is a sequence or string now supports splicing.

## Compiler Additions

- The compiler can generate C++ code for easier interfacing with C++.
- The compiler can generate Objective C code for easier interfacing with Objective C.
- The new pragmas `importcpp` and `importobjc` make interfacing with C++ and Objective C somewhat easier.
- Added a new pragma `incompleteStruct` to deal with incomplete C struct definitions.
- Added a `--nimcache:PATH` configuration option for control over the output directory for generated code.
- The `--genScript` option now produces different compilation scripts which do not contain absolute paths.
- Added `--cincludes:dir`, `--clibdir:lib` configuration options for modifying the C compiler’s header/library search path in cross-platform way.
- Added `--clib:lib` configuration option for specifying additional C libraries to be linked.
- Added `--mainmodule:file` configuration options for specifying the main project file. This is intended to be used in project configuration files to allow commands like `nimrod c` or `nimrod check` to be executed anywhere within the project’s directory structure.
- Added a `--app:staticlib` option for creating static libraries.
- Added a `--tlsEmulation:on|off` switch for control over thread local storage emulation.
- The compiler and standard library now support a taint mode. Input strings are declared with the `TaintedString` string type. If the taint mode is turned on it is a distinct string type which helps to detect input validation errors.
- The compiler now supports the compilation cache via `--symbolFiles:on`. This potentially speeds up compilations by an order of magnitude, but is still highly experimental!
- Added `--import:file` and `--include:file` configuration options for specifying modules that will be automatically imported/incluced.
- `nimrod i` can now optionally be given a module to execute.
- The compiler now performs a simple alias analysis to generate better code.
- The compiler and ENDB now support watchpoints.
- The compiler now supports proper compile time expressions of type `bool` for `on|off` switches in pragmas. In order to not break existing code, `on` and `off` are now aliases for `true` and `false` and declared in the system module.
- The compiler finally supports closures. This is a preliminary implementation, which does not yet support nestings deeper than 1 level and still has many known bugs.

## Library Additions

- Added `system.allocShared`, `system.allocShared0`, `system.deallocShared`, `system.reallocShared`.
- Slicing as implemented by the system module now supports splicing.
- Added explicit channels for thread communication.
- Added `matchers` module for email address etc. matching.
- Added `strutils.unindent`, `strutils.countLines`, `strutils.replaceWord`.
- Added `system.slurp` for easy resource embedding.
- Added `system.running` for threads.
- Added `system.programResult`.
- Added `xmltree.innerText`.
- Added `os.isAbsolute`, `os.dynLibFormat`, `os.isRootDir`, `os.parentDirs`.
- Added `parseutils.interpolatedFragments`.
- Added `macros.treeRepr`, `macros.lispRepr`, `macros.dumpTree`, `macros.dumpLisp`, `macros.parseExpr`, `macros.parseStmt`, `macros.getAst`.
- Added `locks` core module for more flexible locking support.
- Added `irc` module.
- Added `ftpclient` module.
- Added `memfiles` module.
- Added `subexes` module.
- Added `critbits` module.
- Added `asyncio` module.
- Added `actors` module.
- Added `algorithm` module for generic `sort`, `reverse` etc. operations.
- Added `osproc.startCmd`, `osproc.execCmdEx`.
- The `osproc` module now uses `posix_spawn` instead of `fork` and `exec` on Posix systems. Define the symbol `useFork` to revert to the old implementation.
- Added `intsets.assign`.
- Added `system.astToStr` and `system.rand`, `system.doAssert`.
- Added `system.pairs` for built-in types like arrays and strings.