Nim 1.4.0 发布

栏目: 软件资讯 · 发布时间: 5年前

内容简介:Nim 1.4.0 版本已发布。Nim 是一门专注于性能,可移植性和表现力的系统编程语言。 标准库增添和修改 为std / jsonutils模块增加了一些增强。 增加了将JSON数组直接反序列化为HashSet和OrderedSet类型的可能性,并...

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


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Ajax Design Patterns

Ajax Design Patterns

Michael Mahemoff / O'Reilly Media / 2006-06-29 / USD 44.99

Ajax, or Asynchronous JavaScript and XML, exploded onto the scene in the spring of 2005 and remains the hottest story among web developers. With its rich combination of technologies, Ajax provides a s......一起来看看 《Ajax Design Patterns》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

SHA 加密
SHA 加密

SHA 加密工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换