Nim 釋出 0.19 版本 ,指令式程式設計語言
影響後向相容的改變
-
``future``標準庫重新命名為``sugar``。
-
``macros.callsite`` 現在被廢棄, 因為引入了``varargs``。
-
只有一個元素的匿名元組現在可以被寫作``(1,)``,尾隨逗號。該樣例的底層AST是``nnkTupleConstr(newLit 1)`` 。``nnkTupleConstr`` 是你的巨集需要處理的新的結點型別。
-
JS目標的``cstring``索引現在被對映成``charCodeAt``。
-
導致一個物件切片成自身的超型別的賦值現在會在執行時被阻止. 使用``ref object``的繼承代替``object`` 的繼承避免這個問題。
-
``not nil``型別註釋現在通過``{.experimental: "notnil"}``被顯式使能,儘管這個特性在Nim容器中表現不盡如人意。
-
解析器現在對二元操作符旁不一致的空格給出警告,加為他們很容易和一元操作符混淆。這個警告將來會變為錯誤。
-
八進位制字面值``'c``和``'C'`` 字首被廢棄,以使語言與標準庫一致(e.g. ``parseOct``).
-
import 目錄的點風格(例如``import path.to.module`` 代替``import path/to/module``) 已經被廢棄。
標準庫的變化
-
``re.split`` 空的正則表示式現在返回字串的每個字元。
-
``system.instantiationInfo`` 返回的元組現在有一個第三個欄位,包含了例項化的列.
-
``cookies.setCookie`` 不再對過期日期假定UTC。
-
``strutils.formatEng`` 不再對它的``unit`` 引數區分``nil`` 和``""`` 。 相反,空格通過新引數``useUnitSpace``控制。
-
``times.parse`` 和``times.format`` 被重寫。方法簽名一致,所以他應當沒有破壞性。不過新實現有點嚴格,可能會帶來破壞性,比如``parse("2017-01-01 foo", "yyyy-MM-dd")`` 現在將會產生錯誤。
-
``times`` 模組的``proc `-`*(a, b: Time): int64`` 返回值型別變成了``times.Duration`` 以支援更好的時間精度。該方法不再被廢棄。
-
``times.Timezone`` 現在是一個不可變的引用型別,必須顯式使用建構函式``newTimezone``初始化。
-
``posix.Timeval.tv_sec`` 型別改為``posix.Time``。
-
``math.`mod` `` 浮點取模現在和整數取模``mod`` (之前它使用Python那樣的向下取整除法)。使用``math.floorMod`` 保持原來的行為。
-
字串輸入``unicode.isUpper`` 和``unicode.isLower`` 現在要求第二個強制引數``skipNonAlpha``。
-
字串輸入, ``strutils.isUpperAscii`` 和``strutils.isLowerAscii`` 現在要求第二個強制引數``skipNonAlpha``。
-
``osLastError`` 現在被標註為``sideEffect``。
-
``parseHexInt`` 和``parseOctInt`` 方法現在當只有有效字首時失敗, 例如,"0x" 十六進位制整數字首.
-
``terminal.setCursorPos`` 和 ``terminal.setCursorXPos`` 現在在POSIX的0基座標工作正常(之前, 你需要使用1基座標; Windows 一直是正確的)。
-
``lineInfoObj`` 現在返回絕對路徑而不是專案路徑。``lineInfo``, ``check``, ``expect``, ``require``等會用到它。
-
``net.sendTo``不再返回整型,現在發起一個錯誤``OSError``。
-
`threadpool`的`await` 和其派生被重新命名為`blockUntil` 以避免和`async` 巨集的`await` 混淆。
編譯器的破壞性變化
-
未歸檔的``#? braces`` 解析模式被移除。
-
未歸檔的PHP後端被移除。
-
原生程式碼目標的`nimcache`` 預設位置改變.。詳細資訊閱讀[the compiler user guide](https://nim-lang.org/docs/nimc.html#generated-c-code-directory) .
庫增補
-
``re.split`` 現在也支援 ``maxsplit`` 引數以和``strutils.split``保持一致.
-
新增``system.toOpenArray`` 以支援零拷貝切片操作. JavaScript 目標還沒有獲得支援.
-
新增``getCurrentDir``, ``findExe``, ``cpDir`` 和``mvDir`` 方法到``nimscript``.
-
``times`` 模組現在支援納秒時間精度.
-
新增``times.Duration`` 型別代表固定間隔時間.
-
為不同時間單位間換算新增``times.convert`` 方法,比如,天到秒.
-
新增有```cmp``` 引數的``algorithm.binarySearch[T, K]`` 方法 .
-
新增方法``algorithm.upperBound``.
-
新增反雙曲三角函式, ``math.arcsinh``, ``math.arccosh`` 和``math.arctanh`` .
-
新增餘切, 正割和餘割方法``math.cot``, ``math.sec`` ,``math.csc``; 和它們的雙曲, 反函式和反雙曲函式, ``math.coth``, ``math.sech``, ``math.csch``, ``math.arccot``, ``math.arcsec``, ``math.arccsc``, ``math.arccoth``, ``math.arcsech`` ,``math.arccsch`` .
-
為向下整除新增``math.floorMod`` 和``math.floorDiv`` .
-
為有理數新增``rationals.`div```, ``rationals.`mod```, ``rationals.floorDiv`` ,``rationals.floorMod`` .
-
為openArray元素的積新增``math.prod`` .
-
新增 ``parseBinInt`` 來解析字串中的二進位制, 返回其值.
-
parseutils 模組的``parseOct`` 和``parseBin`` 現在也像``parseHexInt``一樣支援``maxLen`` 引數.
-
為記憶體對映檔案新增``flush`` 方法.
-
新增``MemMapFileStream``.
-
新增一個簡單的解釋性事件解析模板``eventParser`` 到``pegs`` 模組.
-
新增``macros.copyLineInfo`` 以 從其它節點複製lineInfo.
-
新增``system.ashr`` 整數代數右移.
庫的變化
-
``macros.astGenRepr``, ``macros.lispRepr`` 和``macros.treeRepr``現在一致地轉義字串字面值.
-
``macros.NimSym`` 和``macros.NimIdent``現在被廢棄,用更一般的``NimNode``代替.
-
``macros.getImpl`` 現在包含型別的pragma,而不是略過.
-
``macros.hasCustomPragma`` 和 ``macros.getCustomPragmaVal`` 現在也支援``ref`` 和``ptr`` 型別, 型別pragmas和變式欄位.
-
為了一致性和正確性``system.SomeReal``現在叫做``SomeFloat`` .
-
``algorithm.smartBinarySearch`` 和``algorithm.binarySearch`` 現在加入了``binarySearch``. ``smartbinarySearch`` 廢棄.
-
`terminal` 模組現在匯出額外的方法為了生成ANSI顏色碼字串.
-
新增``CritBitTree[int].inc``方法的``val`` 引數.
-
`unittest`` 中test塊的異常現在錯誤訊息中顯示它的型別.
-
重寫``compiler/nimeval`` API以簡化"compiler as an API". 使用Nim編譯器和它的VM作為指令碼引擎變得更加容易。見如何在一個原生Nim應用中使用Nim VM 樣例``tests/compilerapi/tcompilerapi.nim``。
-
新增 ``CritBitTree[T].incl``方法的``val`` 引數.
-
``tgamma`` 重新命名為``gamma``. ``tgamma`` 廢棄.
-
``pegs`` 模組現在為它的``Peg``欄位和``NonTerminal`` 物件型別匯出getters。有子節點的``Peg``現在有標準的``items`` 和``pairs`` 迭代器.
-
``net`` 模組中的``accept``現在可以接受nil套接字.
語言增補
-
結合顯式泛型例項化的點呼叫現在被寫作``x.y[:z]`` ,解析器解析成``y[z](x)`` .
-
``func`` 現在是``proc {.noSideEffect.}``的別名.
-
為了使 ``for`` 迴圈和迭代器更加靈活的使用Nim現在支援"for-loop macros". 見手冊[manual](manual.html#macros-for-loop-macros) 這個特性允許Python般的泛型``enumerate`` 實現.
-
Case 語句現在可以用巨集重寫. 見手冊[manual](manual.html#macros-case-statement-macros) 。這個特性允許自定義模式匹配.
-
`typedesc` 特殊型別重新命名為`type`.
-
`static` 和`type` 現在也是`ref` ,`ptr`一樣的修飾語. 它們指代`static[T]` 和`type[T]`.
-
`static`強制編譯期估值現在支援指定想要的目標型別(一個明確的型別或者一類型別)
-
`type` 操作符現在支援檢查提供的表示式匹配期望的型別約束.
語言的變化
-
`importcpp` pragma 現在允許匯入C++泛型列表欄位型別 。 `static[T]`也支援數字引數。(#6415)
-
原生C++ 異常現在可以通過`importcpp` pragma匯入。匯入的異常可以像Nim的異常一樣被髮起和捕獲. 更多細節見語言手冊.
-
字串和序列的``nil`` 終於不見了. 取而代之的預設值為是``"" / @[]``. 使用``--nilseqs:on`` 以過度。
-
訪問Nim原生字串中的0截尾符現在是非法的.Nim字串內部為了和cstring零拷貝的互操作性,仍然有一個尾部0. 用新開關編譯``--laxStrings:on``程式碼,如果你需要過渡。
-
命令語法現在支援首個逗號後的關鍵字引數.
-
執行緒本地變數現在可以在方法內部宣告。這意味著global pragma所有的效果.
-
Nim 現在支援export 語句中的``except`` 從句.
-
延伸浮點型別, 如``range[0.0 .. Inf]``. 更多細節見語言手冊.
-
``{.this.}`` pragma 廢棄. 它從來沒有在泛型中工作過,並且我們發現程式碼比顯式的``obj.field``語法更難讀.
-
"Memory regions"對指標型別已經廢棄,它們幾乎沒有在任何地方用過. 注意這和``--gc:regions`` 沒有任何關係.
-
異常層次稍微重做了, ``SystemError``重新命名為``CatchableError``,並且是其它任何可以捕獲異常的新基類.這個變化應當對既存的Nim程式碼有最小的影響。
工具的變化
-
``jsondoc2`` 重新命名為``jsondoc``, 和``doc2`` 重新命名為``doc``類似. 老的``jsondoc`` 仍然可以用``jsondoc0``呼叫.
編譯器的變化
-
VM's 指令計數限制提高到了300萬指令以支援編譯期的複雜計算。
-
對JavaScript 目標的熱程式碼過載支援已經實現. 用`--hotCodeReloading:on` 編譯程式碼使用,使用助手庫比如LiveReload或者BrowserSync.
-
一個新的編譯器選項 `--cppCompileToNamespace` 把生成的C++程式碼放進Nim的名稱空間以避免和既存的C++程式碼命名衝突. 所有的Nim程式碼都完成了這個實現- 內部的和匯出的.
-
新增``macros.getProjectPath`` 和``ospaths.putEnv`` 方法到Nim的虛擬機器.
-
``deadCodeElim`` 選項現在總是開啟,並且開關不再有效果, 但為了後向相容它可以被識別.
-
``experimental`` 現在是一個pragma / 命令列開關,允許指定的語言擴充套件,不再是全有或全無的一個開關.
-
新增Nintendo Switch 作為一個新的目標平臺. 見編譯器使用者指南[the compiler user guide](https://nim-lang.org/docs/nimc.html)
-
macros.bindSym 現在可以接受不僅字串字面值或常量表達式。 bindSym 增強使得它也可以接受巨集當中、編譯期函式、靜態塊中可計算的字串。它只在模板、普通程式碼中維持原狀。這個新特性可以通過 {.experimental: "dynamicBindSym".} pragma/switch獲取.
-
在Posix 系統上全域性系統配置現在放置在``/etc/nim/nim.cfg``, 之前是``/etc/nim.cfg``. 儘管如此,它通常是不存在的.
-
在Posix系統上使用者配置現在在``$XDG_CONFIG_HOME/nim/nim.cfg``(如果``XDG_CONFIG_HOME`` 沒有定義, 那麼在``~/.config/nim/nim.cfg``). 之前是``$XDG_CONFIG_DIR/nim.cfg`` (和``~/.config/nim.cfg``). 類似地, 在Windows上, 使用者配置現在在 ``%APPDATA%/nim/nim.cfg``。之前是``%APPDATA%/nim.cfg``.