Nim 发布 0.19 版本 ,命令式编程语言

鑫鑫向融
 鑫鑫向融
发布于 2018年09月27日
收藏 0

影响后向兼容的改变

  • ``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``.

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 开源中国社区 [http://www.oschina.net]
本文标题:Nim 发布 0.19 版本 ,命令式编程语言
加载中

最新评论(2

MikeManilone
MikeManilone
Breaking changes every day!
xiaoshiyue
xiaoshiyue
666
返回顶部
顶部