Nim 1.4.0 发布

2020年10月18日

Nim 1.4.0 版本已发布。Nim 是一门专注于性能,可移植性和表现力的系统编程语言。

标准库增添和修改

  • std / jsonutils模块增加了一些增强。

    • 增加了将JSON数组直接反序列化为HashSetOrderedSet类型的可能性,并分别通过jsonutils.fromJsonjsonutils.toJson过程将这些类型的JSON数组序列化。

    • 添加了一种可能性,即通过jsonutils.fromJsonjsonutils.toJson程序将JSONnull对象反序列化为Nim option对象,或者将Nim option对象序列化为JSON对象(如果isSome)或序列化为JSON空对象(如果isNone)。

    • jsonutils.fromJson中添加了一个Joptions参数,当前包含两个布尔选项allowExtraKeysallowMissingKeys。 -如果allowExtraKeystrue,则解析JSON的Nim对象不需要为每个JSON密钥都有一个字段。 -如果allowMissingKeystrue,则允许将解析了JSON的Nim对象具有没有相应JSON密钥的字段。

  • db_sqlite中添加了bindParamsbindParam以将参数绑定到SqlPrepared语句中。

  • db_ *库中添加了tryInsertinsert procs,它接受主键列名。

  • 增加了对xmltree.newVerbatimText的支持,用于创建stylescript的文本。

  • uri模块现在实现RFC-2397。

  • DOM Parser添加到了JavaScript目标的dom模块中。

  • Ordinal的默认哈希值已更改为更多的位加扰。import hashes; proc hash(x:myInt):Hash = hashIdentity(x)在实例化上下文中恢复旧版本,而-d:nimIntHash1在全局范围内恢复旧版本。

  • deques.peekFirstdeques.peekLast现在具有var Deque [T]-> var T重载。

  • 从stdlib中的高级抽象创建的文件句柄将不再被子进程继承。特别地,这些模块受到影响:asyncdispatchasyncnetsystemnativesocketsnetselector

    对于asyncdispatchasyncnetnetnativesockets,已将可继承标志添加到创建套接字的所有proc中,从而允许用户控制生成的套接字是否可继承。提供此标志是为了简化需要套接字继承的多进程服务器的编写。

    在过渡期间,定义nimInheritHandles以默认启用文件句柄继承。由于操作系统之间的语义不同,该标志不会影响选择器模块。

    还引入了asyncdispatch.setInheritablesystem.setInheritablenativesockets.setInheritable来设置文件句柄或套接字继承。并非所有平台都定义了这些proc

  • ioselector_kqueueioselector_epoll为内部簿记创建的文件描述符将不再泄漏给子进程。

  • precision = 0strutils.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,任何不兼容的指针类型均不起作用。 lexbasestreams模块由于存在错误而无法在NimScript上编译,但这已得到修复。

    现在,以下模块可以在JS和NimScript上编译:parsecsvparsecfgparsesqlxmlparserhtmlparserropes。 JS还支持cstrutils.startsWithcstrutils.endsWith,用于NimScript:jsonparsejsonstrtabsunidecode

  • 增加了streams.readStrstreams.peekStr重载以接受要修改的现有字符串,这避免了内存分配,类似于streams.readLine(#13857)。

  • 添加了高级asyncnet.sendToasyncnet.recvFrom UDP功能。

  • dollars。$现在可用于带有nim js的无符号整数。

  • bitops模块的改进,包括位切片,原始掩码功能的不可变版本,mask/masked以及varargs对bitandbitorbitxor的支持。

  • 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, workingDirenv参数。

  • 添加了一个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的索引。

  • renderRstToOutinitRstGenerator添加了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.fmtstrformat.&支持specifier =。现在,fmt"{expr =}"扩展为fmt"expr={expr}"

  • 弃用:使用dirExists代替os.existsDirfileExists代替os.existsFile

  • 添加了jsre模块JavaScript目标的正则表达式.

  • logging.newRollingFileLogger中将maxLines参数设置为Positive,因为负值将导致为每个记录的行创建一个新文件,这没有任何意义。

  • logging中的log更改为对JavaScript使用适当的日志级别,例如debug使用console.debuginfo使用console.infowarn使用console.warn,等等。

  • Tables, HashSets, SharedTables和deques不再需要传递的初始大小必须为2的幂——这是在内部完成的。不建议使用Tables和HashSets的ProcrightSize,因为不再需要它。 CountTable.inc再次使用val:int而不是val:Positive即它可以再次递减

  • 模块中删除了已弃用的符号,其中一些已在0.15中弃用。

  • 删除了sugar.distinctBase,自0.19起已弃用。使用typetraits.distinctBase

  • 导出asyncdispatch.PDispatcher.handles,以便外部低级库可以访问它。

  • std/withsugar.dup现在支持对象字段赋值表达式:

      import std/with
    
      type Foo = object
        x, y: int
    
      var foo = Foo()
      with foo:
        x = 10
        y = 20
    
      echo foo

     

  • Procmath.round已不再使用。相反,使用strformat的建议不能应用于每个用例。充分证明了round的局限性和(缺乏)可靠性。

  • winlean中增加了getprotobyname。在nativesockets中增加了getProtoByname,它从数据库返回与协议name相匹配的协议代码。

  • dom.Navigator添加了缺少的属性和方法,例如deviceMemoryonLinevibrate()等。

  • 添加了strutils.indentationstrutils.dedent,它们允许缩进的字符串文字:

      import strutils
      echo dedent """
        This
          is
            cool!
        """
     
  • uri模块添加了initUri(isIpv6:bool),现在uri支持解析ipv6主机名。

  • osproc中增加了readLines(p:Process)

  • 添加了以下toX处理集合。用法类似于诸如sets.toHashSettables.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.releaseEventsdom.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将特定的警告变成错误。
  • 不建议使用defineundef编译指示。
  • 新命令: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 mainnim 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

展开阅读全文
0 收藏
分享
加载中
精彩评论
相比其他玩具,他不是玩具
2020-10-18 15:54
4
举报
非要明说吗?最近很火的木兰。不是玩具是什么,还有V语言,Z语言
2020-10-18 16:32
2
举报
它到底是不是玩具?
2020-10-18 14:51
1
举报
最新评论 (5)
它到底是不是玩具?
2020-10-18 14:51
1
回复
举报
相比其他玩具,他不是玩具
2020-10-18 15:54
4
回复
举报
相比哪些玩具?
2020-10-18 16:07
0
回复
举报
非要明说吗?最近很火的木兰。不是玩具是什么,还有V语言,Z语言
2020-10-18 16:32
2
回复
举报
这几个应该只能算花瓶吧
2020-10-19 11:44
0
回复
举报
更多评论
5 评论
0 收藏
分享
返回顶部
顶部