内容简介: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
,insert
procs,它接受主键列名。 -
增加了对
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.recvFrom
UDP功能。 -
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:on
Defects
成为不可恢复的错误。 -
添加了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 版本发布
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
王道程序员求职宝典
电子工业出版社 / 2013-11 / 56.00元
本书精选了大量知名企业的程序员笔试、面试题,重点突出、解答翔实。全书共分为四部分,各部分如下:第一部分是程序设计基础及数据结构基础,讨论C/C++基础知识以及数据结构基础知识;第二部分是计算机网络基础,讨论网络模型、套接字编程基本操作、IPv4与IPv6、子网划分、网络常用测试工具等;第三部分是操作系统基础,讨论进程与线程的基本知识、进程间通信与进程同步、内存管理的相关知识等;第四部分是其他计算机......一起来看看 《王道程序员求职宝典》 这本书的介绍吧!