diff options
-rwxr-xr-x | lib/pure/strutils.nim | 23 | ||||
-rwxr-xr-x | lib/system.nim | 1 | ||||
-rwxr-xr-x | todo.txt | 1 | ||||
-rwxr-xr-x | web/news.txt | 7 |
4 files changed, 28 insertions, 4 deletions
diff --git a/lib/pure/strutils.nim b/lib/pure/strutils.nim index 97748c103..8e3816904 100755 --- a/lib/pure/strutils.nim +++ b/lib/pure/strutils.nim @@ -378,6 +378,22 @@ proc parseBool*(s: string): bool = of "y", "yes", "true", "1", "on": result = true of "n", "no", "false", "0", "off": result = false else: raise newException(EInvalidValue, "cannot interpret as a bool: " & s) + +proc parseEnum*[T: enum](s: string): T = + ## parses an enum ``T``. Raises ``EInvalidValue`` for an invalid value in + ## `s`. The comparison is done in a style insensitive way. + for e in low(T)..high(T): + if cmpIgnoreStyle(s, $e) == 0: + return e + raise newException(EInvalidValue, "invalid enum value: " & s) + +proc parseEnum*[T: enum](s: string, default: T): T = + ## parses an enum ``T``. Uses `default` for an invalid value in + ## `s`. The comparison is done in a style insensitive way. + for e in low(T)..high(T): + if cmpIgnoreStyle(s, $e) == 0: + return e + result = default proc repeatChar*(count: int, c: Char = ' '): string {.noSideEffect, rtl, extern: "nsuRepeatChar".} = @@ -1105,5 +1121,8 @@ when isMainModule: doAssert "-ld a-ldz -ld".replaceWord("-ld") == " a-ldz " doAssert "-lda-ldz -ld abc".replaceWord("-ld") == "-lda-ldz abc" - - + + type TMyEnum = enum enA, enB, enC, enuD, enE + doAssert parseEnum[TMyEnum]("enu_D") == enuD + + doAssert parseEnum("invalid enum value", enC) == enC diff --git a/lib/system.nim b/lib/system.nim index 07b5e8734..e14a0962b 100755 --- a/lib/system.nim +++ b/lib/system.nim @@ -2232,4 +2232,3 @@ template eval*(blk: stmt): stmt = when defined(initDebugger): initDebugger() - diff --git a/todo.txt b/todo.txt index 9772f4001..ae4465326 100755 --- a/todo.txt +++ b/todo.txt @@ -1,6 +1,7 @@ version 0.9.0 ============= +- test and document AVR/embedded systems better - make GC realtime capable: GC_step(ms: int) - ``=`` should be overloadable; requires specialization for ``=`` - fix remaining generics bugs diff --git a/web/news.txt b/web/news.txt index 897961c25..84f5f7c18 100755 --- a/web/news.txt +++ b/web/news.txt @@ -12,6 +12,7 @@ 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. Library Additions @@ -24,6 +25,9 @@ Library Additions compile time as if was a macro. - Added ``macros.emit`` that can emit an arbitrary computed string as nimrod code during compilation. +- Added ``strutils.parseEnum``. +- The stdlib can now be avoided to a point where C code generation for 16bit + micro controllers is feasible. Changes affecting backwards compatibility @@ -33,7 +37,7 @@ Changes affecting backwards compatibility 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`` is now a keyword. +- ``static`` and ``do`` 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. @@ -56,6 +60,7 @@ 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. |