Strictly speaking, NimScript is the subset of Nim that can be evaluated by Nim's builtin virtual machine (VM). This VM is used for Nim's compiletime function evaluation features.
The nim executable processes the .nims configuration files in the following directories (in this order; later files overwrite previous settings):
For available procs and implementation details see nimscript.
NimScript is subject to some limitations caused by the implementation of the VM (virtual machine):
Given the above restrictions, at least the following modules are available:
In addition to the standard Nim syntax (system module), NimScripts support the procs and templates defined in the nimscript module too.
A command-line switch --FOO is written as switch("FOO") in NimScript. Similarly, command-line --FOO:VAL translates to switch("FOO", "VAL").
Here are few examples of using the switch proc:
# command-line: --opt:size switch("opt", "size") # command-line: --define:foo or -d:foo switch("define", "foo") # command-line: --forceBuild switch("forceBuild")
NimScripts also support -- templates for convenience, which look like command-line switches written as-is in the NimScript file. So the above example can be rewritten as:
--opt:size --define:foo --forceBuild
Note: In general, the define switches can also be set in NimScripts using switch or --, as shown in above examples. Only the release define (-d:release) cannot be set in NimScripts.
The task template that the system module defines allows a NimScript file to be used as a build tool. The following example defines a task build that is an alias for the c command:
task build, "builds an example": setCommand "c"
In fact, as a convention the following tasks should be available:
Task | Description |
---|---|
help | List all the available NimScript tasks along with their docstrings. |
build | Build the project with the required backend (c, cpp or js). |
tests | Runs the tests belonging to the project. |
bench | Runs benchmarks belonging to the project. |
Look at the module distros for some support of the OS's native package managers.
See the Nimble readme for more information.
NimScript can also be used directly as a portable replacement for Bash and Batch files. Use nim myscript.nims to run myscript.nims. For example, installation of Nimble could be accomplished with this simple script:
mode = ScriptMode.Verbose var id = 0 while dirExists("nimble" & $id): inc id exec "git clone https://github.com/nim-lang/nimble.git nimble" & $id withDir "nimble" & $id & "/src": exec "nim c nimble" mvFile "nimble" & $id & "/src/nimble".toExe, "bin/nimble".toExe
On Unix, you can also use the shebang #!/usr/bin/env nim, as long as your filename ends with .nims:
#!/usr/bin/env nim mode = ScriptMode.Silent echo "hello world"
Use #!/usr/bin/env -S nim --hints:off to disable hints.