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
self
as first argument - Auto definition of constructor (high performance!)
- Assistance with constructor definition
pub
modifier instead of*
- Inheritance with
of
modifier - Creating distinct type with
distinct
modifier {.final.}
by default{.open.}
to allow inheritancesuper
keyword formethod
- Alias class
More features are planned:
Pick
like TypeScript’sPick
let
member 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.