Version 0.9.0 released

Summary

  • Unsigned integers have been added.
  • The integer type promotion rules changed.
  • The template and macro system evolved.
  • Closures have been implemented.
  • Term rewriting macros have been implemented.
  • First steps to unify expressions and statements have been taken.
  • Symbol lookup rules in generics have become stricter to catch more errors.

Bugfixes

  • Fixed a bug where the compiler would “optimize away” valid constant parts of a string concatenation.
  • Fixed a bug concerning implicit type conversions in case statements.
  • Fixed a serious code generation bug that caused algorithm.sort to produce segmentation faults.
  • Fixed ambiguity in recvLine which meant that receiving \r\L was indistinguishable from disconnections.
  • Many more bugfixes, too many to list them all.

Library Additions

  • Added the (already existing) module htmlgen to the documentation.
  • Added the (already existing) module cookies to the documentation.
  • Added system.shallow that can be used to speed up string and sequence assignments.
  • Added system.eval that can execute an anonymous block of code at compile time as if was a macro.
  • Added system.staticExec and system.gorge for compile-time execution of external programs.
  • Added system.staticRead as a synonym for system.slurp.
  • Added macros.emit that can emit an arbitrary computed string as nimrod code during compilation.
  • Added strutils.parseEnum.
  • Added json.% constructor operator.
  • The stdlib can now be avoided to a point where C code generation for 16bit micro controllers is feasible.
  • Added module oids.
  • Added module endians.
  • Added a new OpenGL wrapper that supports OpenGL up to version 4.2.
  • Added a wrapper for libsvm.
  • Added a wrapper for mongodb.
  • Added terminal.isatty.
  • Added an overload for system.items that can be used to iterate over the values of an enum.
  • Added system.TInteger and system.TNumber type classes matching any of the corresponding types available in Nimrod.
  • Added system.clamp to limit a value within an interval [a, b].
  • Added strutils.continuesWith.
  • Added system.getStackTrace.
  • Added system.|| for parallel for loop support.
  • The GC supports (soft) realtime systems via GC_setMaxPause and GC_step procs.
  • The sockets module now supports ssl through the OpenSSL library, recvLine is now much more efficient thanks to the newly implemented sockets buffering.
  • The httpclient module now supports ssl/tls.
  • Added times.format as well as many other utility functions for managing time.
  • Added system.@ for converting an openarray to a seq (it used to only support fixed length arrays).
  • Added system.compiles which can be used to check whether a type supports some operation.
  • Added strutils.format, subexes.format which use the new varargs type.
  • Added module fsmonitor.

Changes affecting backwards compatibility

  • On Windows filenames and paths are supposed to be in UTF-8. The system, os, osproc and memfiles modules use the wide string versions of the WinAPI. Use the -d:useWinAnsi switch to revert back to the old behaviour which uses the Ansi string versions.
  • static, do, interface and mixin are now keywords.
  • Templates now participate in overloading resolution which can break code that uses templates in subtle ways. Use the new immediate pragma for templates to get a template of old behaviour.
  • There is now a proper distinction in the type system between expr and PNimrodNode which unfortunately breaks the old macro system.
  • pegs.@ has been renamed to pegs.!* and pegs.@@ has been renamed to pegs.!*\ as @ operators now have different precedence.
  • The type proc (without any params or return type) is now considered a type class matching all proc types. Use proc () to get the old meaning denoting a proc expecing no arguments and returning no value.
  • Deprecated system.GC_setStrategy.
  • re.findAll and pegs.findAll don’t return captures anymore but matching substrings.
  • RTTI and thus the marshall module don’t contain the proper field names of tuples anymore. This had to be changed as the old behaviour never produced consistent results.
  • Deprecated the ssl module.
  • Deprecated nimrod pretty as it never worked good enough and has some inherent problems.
  • The integer promotion rules changed; the compiler is now less picky in some situations and more picky in other situations: In particular implicit conversions from int to int32 are now forbidden.
  • system.byte is now an alias for uint8; it used to be an alias to int8.
  • bind expressions in templates are not properly supported anymore. Use the declarative bind statement instead.
  • The default calling convention for a procedural type is now closure, for procs it remains nimcall (which is compatible to closure). Activate the warning ImplicitClosure to make the compiler list the occurrences of proc types which are affected.
  • The Nimrod type system now distinguishes openarray from varargs.
  • Templates are now hygienic. Use the dirty pragma to get the old behaviour.
  • Objects that have no ancestor are now implicitly final. Use the inheritable pragma to introduce new object roots apart from TObject.
  • Macros now receive parameters like templates do; use the callsite builtin to gain access to the invocation AST.
  • Symbol lookup rules in generics have become stricter to catch more errors.

Compiler Additions

  • Win64 is now an officially supported target.
  • The Nimrod compiler works on BSD again, but has some issues as os.getAppFilename and os.getAppDir cannot work reliably on BSD.
  • The compiler can detect and evaluate calls that can be evaluated at compile time for optimization purposes with the --implicitStatic command line option or pragma.
  • The compiler now generates marker procs that the GC can use instead of RTTI. This speeds up the GC quite a bit.
  • The compiler now includes a new advanced documentation generator via the doc2 command. This new generator uses all of the semantic passes of the compiler and can thus generate documentation for symbols hiding in macros.
  • The compiler now supports the dynlib pragma for variables.
  • The compiler now supports bycopy and byref pragmas that affect how objects/tuples are passed.
  • The embedded profiler became a stack trace profiler and has been documented.

Language Additions

  • Added explicit static sections for enforced compile time evaluation.
  • Added an alternative notation for lambdas with do.
  • addr is now treated like a prefix operator syntactically.
  • Added global pragma that can be used to introduce new global variables from within procs.
  • when expressions are now allowed just like if expressions.
  • The precedence for operators starting with @ is different now allowing for sigil-like operators.
  • Stand-alone finally and except blocks are now supported.
  • Macros and templates can now be invoked as pragmas.
  • The apostrophe in type suffixes for numerical literals is now optional.
  • Unsigned integer types have been added.
  • The integer promotion rules changed.
  • Nimrod now tracks proper intervals for range over some built-in operators.
  • In parameter lists a semicolon instead of a comma can be used to improve readability: proc divmod(a, b: int; resA, resB: var int).
  • A semicolon can now be used to have multiple simple statements on a single line: inc i; inc j.
  • bind supports overloaded symbols and operators.
  • A distinct type can now borrow from generic procs.
  • Added the pragmas gensym, inject and dirty for hygiene in templates.
  • Comments can be continued with a backslash continuation character so that comment pieces don’t have to align on the same column.
  • Enums can be annotated with pure so that their field names do not pollute the current scope.
  • A proc body can consist of an expression that has a type. This is rewritten to result = expression then.
  • Term rewriting macros (see trmacros) have been implemented but are still in alpha.