内容简介:Nim 1.4.0 版本已发布。Nim 是一门专注于性能,可移植性和表现力的系统编程语言。 标准库增添和修改 为std / jsonutils模块增加了一些增强。 增加了将JSON数组直接反序列化为HashSet和OrderedSet类型的可能性,并...
Nim 1.4.0 版本已发布。Nim 是一门专注于性能,可移植性和表现力的系统编程语言。
标准库增添和修改
-
为
std / jsonutils模块增加了一些增强。-
增加了将JSON数组直接反序列化为
HashSet和OrderedSet类型的可能性,并分别通过jsonutils.fromJson和jsonutils.toJson过程将这些类型的JSON数组序列化。 -
添加了一种可能性,即通过
jsonutils.fromJson和jsonutils.toJson程序将JSONnull对象反序列化为Nim option对象,或者将Nim option对象序列化为JSON对象(如果isSome)或序列化为JSON空对象(如果isNone)。 -
在
jsonutils.fromJson中添加了一个Joptions参数,当前包含两个布尔选项allowExtraKeys和allowMissingKeys。 -如果allowExtraKeys为true,则解析JSON的Nim对象不需要为每个JSON密钥都有一个字段。 -如果allowMissingKeys为true,则允许将解析了JSON的Nim对象具有没有相应JSON密钥的字段。
-
-
在
db_sqlite中添加了bindParams,bindParam以将参数绑定到SqlPrepared语句中。 -
在
db_ *库中添加了tryInsert,insertprocs,它接受主键列名。 -
增加了对
xmltree.newVerbatimText的支持,用于创建style,script的文本。 -
uri模块现在实现RFC-2397。 -
将DOM Parser添加到了JavaScript目标的
dom模块中。 -
Ordinal的默认哈希值已更改为更多的位加扰。import hashes; proc hash(x:myInt):Hash = hashIdentity(x)在实例化上下文中恢复旧版本,而-d:nimIntHash1在全局范围内恢复旧版本。 -
deques.peekFirst和deques.peekLast现在具有var Deque [T]-> var T重载。 -
从stdlib中的高级抽象创建的文件句柄将不再被子进程继承。特别地,这些模块受到影响:
asyncdispatch,asyncnet,system,nativesockets,net和selector。对于
asyncdispatch,asyncnet,net和nativesockets,已将可继承标志添加到创建套接字的所有proc中,从而允许用户控制生成的套接字是否可继承。提供此标志是为了简化需要套接字继承的多进程服务器的编写。在过渡期间,定义
nimInheritHandles以默认启用文件句柄继承。由于操作系统之间的语义不同,该标志不会影响选择器模块。还引入了
asyncdispatch.setInheritable,system.setInheritable和nativesockets.setInheritable来设置文件句柄或套接字继承。并非所有平台都定义了这些proc。 -
由
ioselector_kqueue和ioselector_epoll为内部簿记创建的文件描述符将不再泄漏给子进程。 -
precision = 0的strutils.formatFloat已恢复到生成小数点的版本1行为,例如formatFloat(3.14159, precision = 0)现在是3.而不是3。 -
在
critbits中增加了commonPrefixLen。 -
relativePath(rel,abs)和relativePath(abs,rel)用于静默给出错误的结果(请参阅#13222);取而代之的是他们现在使用getCurrentDir来解决这些情况,并且现在可以抛出getCurrentDir抛出的情况。relativePath现在也适用于带有-d:nodejs的js。 -
JavaScript和NimScript标准库的变化:JavaScript现在支持
streams.StringStream,其局限性在于所使用的任何缓冲区pointer必须可转换为ptr string,任何不兼容的指针类型均不起作用。lexbase和streams模块由于存在错误而无法在NimScript上编译,但这已得到修复。现在,以下模块可以在JS和NimScript上编译:
parsecsv,parsecfg,parsesql,xmlparser,htmlparser和ropes。 JS还支持cstrutils.startsWith和cstrutils.endsWith,用于NimScript:json,parsejson,strtabs和unidecode。 -
增加了
streams.readStr和streams.peekStr重载以接受要修改的现有字符串,这避免了内存分配,类似于streams.readLine(#13857)。 -
添加了高级
asyncnet.sendTo和asyncnet.recvFromUDP功能。 -
dollars。$现在可用于带有nim js的无符号整数。 -
对
bitops模块的改进,包括位切片,原始掩码功能的不可变版本,mask/masked以及varargs对bitand,bitor和bitxor的支持。 -
sugar.=>和sugar.->的变化:以前将((x,y:int)转换为(x:auto,y:int),现在变成了(x: int, y: int)与常规proc定义保持一致(尽管您不能使用分号)。现在可以在
=>的左侧使用语法和使用名称。这是这些更改的示例:import sugar foo(x, y: int) {.noSideEffect.} => x + y # is transformed into proc foo(x: int, y: int): auto {.noSideEffect.} = x + y -
times.DateTime字段现在是私有的,可以使用getter和不推荐使用的setter进行访问。 -
times模块现在可以更一致地处理DateTime的默认值。给定未初始化的DateTime时,大多数proc都会引发断言错误,例外是==和$(返回"未初始化的DateTime")。 增加了过程times.isInitialized,可用于检查DateTime是否已初始化。 -
修复了一个错误,即在
osproc.startProcess中的io流上调用close是noop并导致挂起,如果进程同时从stdin读取和写入(例如到stdout)。 -
传递给
system.onThreadDestruction的回调现在必须为.raises:[]。 -
分配给
system.onUnhandledException的回调现在必须为.gcsafe。 -
osproc.execCmdEx现在采用可选的input作为stdin,workingDir和env参数。 -
添加了一个
ssl_config模块,其中包含Mozilla OpSec推荐的安全密码列表 -
根据Mozilla的建议,
net.newContext现在默认为针对"中间兼容性"的密码列表,而不是ALL。此更改应保护用户免受使用弱密码和不安全密码的侵害,同时仍可与大多数Internet充分兼容。 -
添加了带有可挂接的
jsonTo,toJson,fromJson操作的新模块std/jsonutils,用于自定义类型的json序列化/反序列化。 -
添加了一个新的proc
heapqueue.find [T](heap:HeapQueue [T],x:T):int以获取元素x的索引。 -
为
renderRstToOut和initRstGenerator添加了rstgen.rstToLatex便利程序。 -
添加了
os.normalizeExe。 -
macros.newLit现在保留已命名和未命名元组。 -
添加了
random.gauss,它使用从高斯分布中采样的均匀比率方法。 -
添加了
typetraits.elementType以获取可迭代的元素类型。 -
typetraits.$更改:$(int,)现在是"(int,)"而不是"(int)";$tuple[]现在是"tuple[]"而不是"tuple";$((int,float),int)现在是"((int, float), int)"而不是"(int, float), int)元组" -
添加了
macros.extractDocCommentsAndRunnables助手。 -
strformat.fmt和strformat.&支持specifier =。现在,fmt"{expr =}"扩展为fmt"expr={expr}"。 -
弃用:使用
dirExists代替os.existsDir,fileExists代替os.existsFile。 -
添加了
jsre模块JavaScript目标的正则表达式.。 -
在
logging.newRollingFileLogger中将maxLines参数设置为Positive,因为负值将导致为每个记录的行创建一个新文件,这没有任何意义。 -
将
logging中的log更改为对JavaScript使用适当的日志级别,例如debug使用console.debug,info使用console.info,warn使用console.warn,等等。 -
Tables, HashSets, SharedTables和deques不再需要传递的初始大小必须为2的幂——这是在内部完成的。不建议使用Tables和HashSets的Proc
rightSize,因为不再需要它。CountTable.inc再次使用val:int而不是val:Positive即它可以再次递减。 -
从
宏模块中删除了已弃用的符号,其中一些已在0.15中弃用。 -
删除了
sugar.distinctBase,自0.19起已弃用。使用typetraits.distinctBase。 -
导出
asyncdispatch.PDispatcher.handles,以便外部低级库可以访问它。 -
std/with,sugar.dup现在支持对象字段赋值表达式:import std/with type Foo = object x, y: int var foo = Foo() with foo: x = 10 y = 20 echo foo -
Proc
math.round已不再使用。相反,使用strformat的建议不能应用于每个用例。充分证明了round的局限性和(缺乏)可靠性。 -
在
winlean中增加了getprotobyname。在nativesockets中增加了getProtoByname,它从数据库返回与协议name相匹配的协议代码。 -
向
dom.Navigator添加了缺少的属性和方法,例如deviceMemory,onLine,vibrate()等。 -
添加了
strutils.indentation和strutils.dedent,它们允许缩进的字符串文字:import strutils echo dedent """ This is cool! """ -
向
uri模块添加了initUri(isIpv6:bool),现在uri支持解析ipv6主机名。 -
在
osproc中增加了readLines(p:Process)。 -
添加了以下
toX处理集合。用法类似于诸如sets.toHashSet和tables.toTable之类的proc。以前,必须创建相应的空集合并手动添加项目。 *critbits.toCritBitTree,它从项的openArray或成对的openArray创建CritBitTree。 *deques.toDeque,从一个openArray创建一个Deque。 *heapqueue.toHeapQueue,从一个openArray创建一个HeapQueue。 *intsets.toIntSet,它从一个openArray创建一个IntSet。 -
在
asyncftpclient.newAsyncFtpClient中添加了progressInterval参数,以控制调用进度回调的间隔。 -
添加了
os.copyFileToDir。
语言更改
-
=destroy钩子不再需要重置其目标,因为编译器现在会在需要的地方自动插入wasMoved调用。 -
为了清楚起见,
=钩子现在叫做=copy。旧名称=仍然可用,因此无需更新代码。此更改也已反向移植到1.2,因此您可以使用更具可读性的=copy,而不会失去兼容性。 -
现在在newruntime中,只要case对象没有自定义析构函数,就可以不受限制地分配给discriminator字段.discriminator值也不必是常量。如果您有一个case对象的自定义析构函数,并且想自由分配鉴别符字段,建议将对象重构为2个这样的对象:
type MyObj = object case kind: bool of true: y: ptr UncheckedArray[float] of false: z: seq[int] proc `=destroy`(x: MyObj) = if x.kind and x.y != nil: deallocShared(x.y)重构成
type MySubObj = object val: ptr UncheckedArray[float] MyObj = object case kind: bool of true: y: MySubObj of false: z: seq[int] proc `=destroy`(x: MySubObj) = if x.val != nil: deallocShared(x.val) -
枚举类型符号上的
getImpl现在返回字段符号而不是标识。这有助于编写类型宏。向后兼容的旧行为可以通过--useVersion:1.0恢复。 -
现在,用于proc标头的类型化AST将使参数为syms而不是idents。这有助于编写类型宏。可以使用
--useVersion:1.0恢复旧版本的向后兼容性。 -
如果用
importc/importcpp/importjs/importobjc声明,则let语句现在可以不带值使用。 -
关键字
from现在可以用作运算符。 -
从
system.Defect继承的异常不再通过.raises:[]异常跟踪机制进行跟踪。这与内置操作更加一致。以下始终用于编译(并且仍然可以编译):proc mydiv(a, b): int {.raises: [].} = a div b # can raise an DivByZeroDefect现在可以编译
proc mydiv(a, b): int {.raises: [].} = if b == 0: raise newException(DivByZeroDefect, "division by zero") else: result = a div b原因是
DivByZeroDefect继承自Defect,并且带有--panics:onDefects成为不可恢复的错误。 -
添加了Microsoft指定的
thiscall调用约定,主要用于挂钩。 -
不建议使用
{.unroll.}编译指示,因为编译器始终会忽略它。 -
删除了不推荐使用的
strutils.isNilOrWhitespace。 -
删除了不推荐使用的
sharedtables.initSharedTable。 -
删除了弃用的
asyncdispatch.newAsyncNativeSocket。 -
删除了弃用的
dom.releaseEvents和dom.captureEvents。 -
删除了
sharedlists.initSharedList,不建议使用,并产生不确定的行为。 -
有一个称为"strictFuncs"的新实验功能,它使
.noSideEffect的定义更加严格。 请参阅此处了解更多信息。 -
"for循环宏"(请参阅手册)不再是实验性功能。换句话说,如果您想使用它们,则不必编写杂注
{.experimental:"forLoopMacros".}。 -
添加了
.noalias编译指示。它映射到C的restrict关键字以提高此关键字可以启用的性能。 -
items不再使用带有孔的枚举编译,因为它的行为容易出错,请参见#14004。 -
必须通过
--deepcopy:on为--gc:arc和--gc:orc显式启用system.deepcopy。 -
添加了
std / effecttraits模块,用于自省推断的效果。我们希望这能使异步宏能够精确地针对可能引发的异常进行处理。 -
编译指示块
{.gcsafe。}:...和{.noSideEffect。}:...现在也可以写成{.cast(gcsafe).}:...和{ .cast(noSideEffect).}:...。这是编写这些内容的新的首选方式,强调了它们的不安全特性。
编译器更改
- 现在可以通过
--warningAsError [X]:on | off将特定的警告变成错误。 - 不建议使用
define和undef编译指示。 - 新命令:
nim r main.nim [args ...],编译并运行main.nim,并暗含--usenimcache,以便使用相同的逻辑将输出保存到nimcache/mainnimcache/mainexeExt作为nim c -r可以避免在源代码不变的情况下重新编译。 例:nim r compiler/nim.nim --help #仅在第一次编译时 echo 'import os; echo getCurrentCompilerExe()'| nim r - #也可以 nim r compiler/nim.nim --fullhelp #无需重新编译 nim r --nimcache/tmp main #将二进制文件保存到/tmp/main - 现在支持
--hint:processing,它的意思是--hint:processing:on(同样带有其他提示和警告),与所有其他bool标志一致(自1.3.3开始)。 nim doc -r main和nim rst2html -r main现在调用openDefaultBrowser。- 添加了新的提示
--hint:msgOrigin将显示在哪里生成了编译器msg(hint|warning|error);这特别有用,尤其是当它不明显来自何处时,要么是因为多个位置生成同一条消息,要么是因为该消息涉及运行时格式化。 - 添加了新标志
--backend:js | c | cpp | objc(或-b:js等),以更改后端;可以与任何命令一起使用(例如nim r,doc,check等);安全地重新分配。 - 添加了新标志
--doccmd:cmd来传递runnableExamples的其他标志,例如:--doccmd:-d:foo --threads使用--doccmd:skip`来跳过runnableExamples和第一个测试片段。 - 添加了新标志
--usenimcache,以将二进制文件输出到nimcache。 runnableExamples "-b:cpp -r:off":code现在受支持,允许重写示例的编译和运行方式,例如更改后端。- 当未指定
--outdir时(带有或不带有--project),nim doc现在在$projectPath/htmldocs下输出;传递--project现在会自动生成索引并启用搜索。有关详细信息,请参见docgen。 - 删除了
--oldNewlines开关。 - 删除了
--laxStrings开关,用于改变字符串内部的零终止符。 - 移除了
--oldast开关。 - 删除了
--oldgensym开关。 $getType(untyped)现在是"untyped"而不是"expr",$getType(typed)现在是"typed"而不是"stmt"。- 现在默认情况下默认禁用sink推断,并且必须通过--sinkInference:on显式启用。 注意:对于标准库,接收器推断保持启用状态。此更改与--gc:arc和--gc:orc内存管理模式最相关。
工具变更
nimsuggest现在可以在def查询中同时返回正向声明和实现位置。以前的行为是仅返回前向声明。
发布说明:https://nim-lang.org/blog/2020/10/16/version-140-released.html
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- NPM包(模块)发布、更新、撤销发布
- 有赞灰度发布与蓝绿发布实践
- 【重磅发布】Linkis 0.10.0 版本发布
- BeetlSQL 3.0.9 发布,Idea 插件发布
- 贝密游戏 0.7.0 发布,发布斗地主
- 【重磅发布】DataSphere Studio 0.9.0 版本发布
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。