This Month with Nim: October 2021
02 November 2021 The Nim Community
Turing Complete
Author: Stuffe
In this challenging puzzle game, you build a computer from scratch and program it. It is a journey through the layers of abstractions of the computer. The game begins when you are abducted by aliens who are testing your intelligence, and from here a lighthearted sci-fi plot evolves. It is available on Steam.
This game was made in Godot and Nim with godot-nim.
changer
Author: Iffy
I love projects that keep an accurate changelog. But most people (me included) don’t like maintaining a changelog or fixing conflicts in the changelog. With changer you can add a conflict-free, easy-to-maintain changelog to your project!
Initial setup:
nimble install changer mkdir myproject && cd myproject changer init Any time you want to add a new changelog entry run changer add and follow the two prompts:
$ changer add Change type: [F]ix [N]ew feature [B]reaking change [O]ther (default) Describe change (this will show up in the changelog): This project has a changelog now! changes/new-This-project-has-20211005-132645.md When you’re ready to release a new version run changer bump to combine all pending changes into the CHANGELOG.md file.
$ cat CHANGELOG.md # v0.1.0 - 2021-10-05 - **NEW:** This project has a changelog now! - **FIX:** Fixed a broken thing Changer can also convert issue numbers into links (or do other simple substitutions), automatically change the version in your .nimble file or even a package.json file. Happy coding!
OOlib
Authors: Neo
OOlib is a nimble package for object oriented programming in Nim. Example:
import strformat import oolib # add `pub` prefix to export class class pub Person: var name*: string age* = 0 # auto insert `self` as first argument proc `$`*: string = fmt"<Person> name: {self.name}" proc happyBirthday* = inc self.age # auto define constructor let p1 = newPerson("Tony") let p2 = newPerson("Steve", 100) It has the following features:
- Member variables with default values
- Class data constants
- Definition of
proc,method,func, etc… (the only exception beingmacro) - Auto inserting
selfas first argument - Auto definition of constructor (high performance!)
- Assistance with constructor definition
pubmodifier instead of*- Inheritance with
ofmodifier - Creating distinct type with
distinctmodifier {.final.}by default{.open.}to allow inheritancesuperkeyword formethod- Alias class
More features are planned:
Picklike TypeScript’sPickletmember variables- struct
- protocol like
interface
LibVF.IO
Author: Arthur Rasmusson
LibVF.IO is commodity GPU multiplexing driven by YAML & VFIO. We wrote an article about it here.
LibVF.IO is made in Nim. :)
Metaprogramming in Nim: Introduction
Author: Kiloneie
In this video I show and teach Nim’s metaprogramming features and capabilities. Each of its features are explained and demonstrated in a beginner-friendly manner.
Nimscripter 1.0.0 - The Rewrittening
Author: Jason Beetham
Over the past few months I have slowly been chipping at a Nimscripter rewrite and got it to a usable state in October! No longer does it rely on silly string serialization or other annoying things, you can now easily expose code to a VM and call it or expose VM code to the compiled code and call it. The following is a simple example:
import nimscripter addCallable(someNSModule): proc doThing(a: int): int var someNum = 10 proc doOtherThing: bool = true exportTo(someNsModule, someNum, doOtherThing) const script = """ proc doThing*(a: int): int = if doOtherThing(): someNum * a else: 0 """ addins = implNimScriptModule(someNsModule) let intr = loadScript(NimScriptFile(script), addins) assert intr.invoke(doThing, 2, returnType = int) == 2 * someNum someNum = 30 assert intr.invoke(doThing, 4, returnType = int) == 4 * someNum What’s that I hear, “Oh it’d be cool if it worked with emscripten”?! Well it does!
Want to see your project here next month?
Follow this to add your project to the next month’s blog post.