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支持所有主流的操作系统,以及多个小众系统。 我们为完美支持这三个主流操作系统而感到自豪。
上面的游戏就是用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
包名和仓库URL在packages.json中声明,并存储于GitHub中。
packages.json
软件包使用特殊的.nimble文件格式进行定义,.nimble格式会被Nim编译器评估。 这意味着它支持Nim编程语言的大部分子集, 支持各种强大的功能,包括能够指定操作系统和外部依赖项。
.nimble
# 包 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"
{.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库。 开发者可以轻松访问由成熟且功能强大的库组成的大型生态系统。
当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]