I noticed that friction to using different languages comes
from not so much the differences in syntax, or even the ideas, but being productive in the environment of the language.
The knowledge of one language’s build system (say python’s distutils/wheel/pip
) to another (OCaml’s ocamlbuild/dune
) is not
exactly transferable. So the developer goes back to using their goldilock zone and
doesn’t make progress in using the new language.
Nim is a language I would like to use more of. But, I always appear to get stuck when trying to use nimble to start a new project. I wanted to exercise writing a new project from start, but also make it easy for myself “not to think too much” when I wanted to start a small app or even a script next time. In Python, it is almost muscle memory now to use poetry to kickstart a project. For nim, there is a project template called nimptemplate that you can use to create a fresh project. I studied that project, and a couple of nim projects on github to figure out the necessary and common elements, and created a cookiecutter template that can be invoked like this:
cookiecutter https://github.com/btbytes/cookiecutter-nimproject.git
Cookiecutter then asks a few questions (project name, author, license) to generate a fresh project.
What I learnt about nim/nimble project setup from doing this:
- Essential fields that go into a project’s
.nimble
file - How to add common tasks (eg: release, debug builds) to the
.nimble
file - Directory structure (
src, docs, examples, tests
) - How to write a simple assertion test and run it using nimble. (
doAssert 1 + 1 == 2
and `nimble test) - Add third party Dependencies. (
requires "nimpy"
)