特点

直观、干净的语法

Nim从多种语言中汲取了灵感,所以语法很容易被理解, 你可以轻易写出可读性和可维护性很高的代码。

  • 缩进优先的语法
  • 以Python为灵感的多重结构
  • 多行的lambda表达式
  • 源于Oberon的可视化标记
  • 用于精简声明的类型节则来自Pascal
import strformat
type
  Person = object
    name*: string # 字段通过`*`导出。

    age: Natural # 自然数类型确保年龄是正确的。


var people = [
  Person(name: "John", age: 45),
  Person(name: "Kate", age: 30)
]

for person in people:
  # 类型安全的字符串中变量赋值

  echo(fmt"{person.name} is {person.age} years old")

多操作系统支持

Nim支持所有主流的操作系统,以及多个小众系统。
我们为完美支持这三个主流操作系统而感到自豪。

编译为JavaScript

Nim包含了一个一流的JavaScript后端, 这样您就可以毫不费力地同时开发客户端和服务器。

New Game: N Play/Pause: P Controls: ← → ↑ ↓

上面的游戏就是用Nim写成的, 使用JavaScript后端编译, 使用canvas API进行绘制。

源码: https://github.com/dom96/snake

体验网站: http://picheta.me/snake

import dom

proc onLoad(event: Event) =
  let p = document.createElement("p")
  p.innerHTML = "Click me!"
  p.style.fontFamily = "Helvetica"
  p.style.color = "red"

  p.addEventListener("click",
    proc (event: Event) =
      window.alert("Hello World!")
  )

  document.body.appendChild(p)

window.onload = onLoad

核心更小,可扩展性更高

通过提供强大的元编程功能,Nim语言实现了更小的核心。

Nim中的元编程功能包括了对泛型、模板和宏的支持。 这使得Nim可以扩展和支持各种编程范例,并避免了开发人员使用样板。 通过使用这些元编程功能,标准库实现异步等待。 Nim社区还开发了各种实现不同编程范式的包。

        import macros, strutils

        macro toEnum(words: static[string]): untyped =
          result = newTree(nnkEnumTy, newEmptyNode())

          for w in splitWhitespace(words):
            result.add ident(w)

        type
          Color = toEnum"Red Green Blue Indigo"

        var color = Indigo

提供对零散的包进行管理

Nim的包管理器叫做Nimble。 通过Git和Mercurial存储库来分发软件包, 通过远程查询标签来确定版本信息。

包名和仓库URL在packages.json中声明,并存储于GitHub中。

软件包使用特殊的.nimble文件格式进行定义,.nimble格式会被Nim编译器评估。 这意味着它支持Nim编程语言的大部分子集, 支持各种强大的功能,包括能够指定操作系统和外部依赖项。

# 包


version = "v0.1.0"
author = "Benedict Cumberbatch"
description = "Sample package."
license = "MIT"

# 依赖

requires "nim >= 0.13.0", "jester >= 0.1.0"

import distros
if detectOs(Ubuntu):
  foreignDep "libssl-dev"
else:
  foreignDep "openssl"

task test, "Run the tester!":
  withDir "tests":
    exec "nim c -r tester"

简便地对C、C++Objective C进行交互

{.passL: "-lsfml-graphics -lsfml-system -lsfml-window".}

type
  VideoMode* {.importcpp: "sf::VideoMode".} = object
  RenderWindowObj {.importcpp: "sf::RenderWindow".} = object
  RenderWindow* = ptr RenderWindowObj
  Color* {.importcpp: "sf::Color".} = object
  Event* {.importcpp: "sf::Event".} = object

{.push cdecl, header: "<SFML/Graphics.hpp>".} 
{.push importcpp.} 
proc videoMode*(modeWidth, modeHeight: cuint,
                modeBitsPerPixel: cuint=32): VideoMode
proc newRenderWindow*(mode: VideoMode, title: cstring): RenderWindow
proc pollEvent*(window: RenderWindow, event: var Event): bool
proc newColor*(red, green, blue, alpha: uint8):Color 
proc clear*(window: RenderWindow, color: Color) 
proc display*(window: RenderWindow) 

Nim可以轻松绑定到C、C++和Objective C库。 开发者可以轻松访问由成熟且功能强大的库组成的大型生态系统。

实用的报错信息

灵感来源于Python。

当Nim应用程序因异常而崩溃时 它会在终止之前输出堆栈跟踪。 Nim的堆栈跟踪格式非常易于掌握, 因为它包含了调试异常所需的所有信息。

Traceback (most recent call last)
module.nim(10) module
module.nim(8) readData
strutils.nim parseInt
Error: unhandled exception:
        invalid integer: Hello World [ValueError]

更多问题,请参阅 常见问题