summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--doc/nims.rst180
1 files changed, 172 insertions, 8 deletions
diff --git a/doc/nims.rst b/doc/nims.rst
index 53199782c..8e3638d62 100644
--- a/doc/nims.rst
+++ b/doc/nims.rst
@@ -28,8 +28,9 @@ previous settings):
 
 For available procs and implementation details see `nimscript <nimscript.html>`_.
 
+
 Limitations
-=================================
+===========
 
 NimScript is subject to some limitations caused by the implementation of the VM
 (virtual machine):
@@ -47,18 +48,50 @@ NimScript is subject to some limitations caused by the implementation of the VM
 * More than one level of `ref` is generally not supported (for example, the type
   `ref ref int`).
 
-* multimethods are not available.
+* Multimethods are not available.
+
+* ``random.randomize()`` requires an ``int64`` explicitly passed as argument, you *must* pass a Seed integer.
+
+* ``unicode`` can be imported, but not ``unidecode``.
 
-Given the above restrictions, at least the following modules are available:
+
+Standard library modules
+========================
+
+At least the following standard library modules are available:
 
 * `macros <macros.html>`_
 * `os <os.html>`_
 * `strutils <strutils.html>`_
 * `math <math.html>`_
 * `distros <distros.html>`_
-
-In addition to the standard Nim syntax (`system <system.html>`_
-module), NimScripts support the procs and templates defined in the
+* `sugar <sugar.html>`_
+* `algorithm <algorithm.html>`_
+* `base64 <base64.html>`_
+* `bitops <bitops.html>`_
+* `chains <chains.html>`_
+* `colors <colors.html>`_
+* `complex <complex.html>`_
+* `htmlgen <htmlgen.html>`_
+* `httpcore <httpcore.html>`_
+* `lenientops <lenientops.html>`_
+* `mersenne <mersenne.html>`_
+* `options <options.html>`_
+* `parseutils <parseutils.html>`_
+* `punycode <punycode.html>`_
+* `random <punycode.html>`_
+* `stats <stats.html>`_
+* `strformat <strformat.html>`_
+* `strmisc <strmisc.html>`_
+* `strscans <strscans.html>`_
+* `unicode <unicode.html>`_
+* `uri <uri.html>`_
+* `std/editdistance <editdistance.html>`_
+* `std/wordwrap <wordwrap.html>`_
+* `std/sums <sums.html>`_
+
+In addition to the standard Nim syntax (`system <system.html>`_ module),
+NimScripts support the procs and templates defined in the
 `nimscript <nimscript.html>`_ module too.
 
 
@@ -130,8 +163,6 @@ See the `Nimble readme <https://github.com/nim-lang/nimble#readme>`_
 for more information.
 
 
-
-
 Standalone NimScript
 ====================
 
@@ -165,3 +196,136 @@ ends with ``.nims``:
   echo "hello world"
 
 Use ``#!/usr/bin/env -S nim --hints:off`` to disable hints.
+
+
+Benefits
+========
+
+Cross-Platform
+--------------
+
+It is a cross-platform scripting language that can run where Nim can run,
+e.g. you can not run Batch or PowerShell on Linux or Mac,
+the Bash for Linux might not run on Mac,
+there are no unit tests tools for Batch, etc.
+
+NimScript can detect on which platform, operating system,
+architecture, and even which Linux distribution is running on,
+allowing the same script to support a lot of systems.
+
+See the following (incomplete) example:
+
+.. code-block:: nim
+
+  import distros
+
+  # Architectures.
+  if defined(amd64):
+    echo "Architecture is x86 64Bits"
+  elif defined(i386):
+    echo "Architecture is x86 32Bits"
+  elif defined(arm):
+    echo "Architecture is ARM"
+
+  # Operating Systems.
+  if defined(linux):
+    echo "Operating System is GNU Linux"
+  elif defined(windows):
+    echo "Operating System is Microsoft Windows"
+  elif defined(macosx):
+    echo "Operating System is Apple OS X"
+
+  # Distros.
+  if detectOs(Ubuntu):
+    echo "Distro is Ubuntu"
+  elif detectOs(ArchLinux):
+    echo "Distro is ArchLinux"
+  elif detectOs(Debian):
+    echo "Distro is Debian"
+
+
+Uniform Syntax
+--------------
+
+The syntax, style, and rest of the ecosystem is the same as for compiled Nim,
+that means there is nothing new to learn, no context switch for developers.
+
+
+Powerful Metaprogramming
+------------------------
+
+NimScript can use Nim's templates, macros, types, concepts, effect tracking system, and more,
+you can create modules that work on compiled Nim and also on interpreted NimScript.
+
+``func`` will still check for side effects, ``debugEcho`` also works as expected,
+making it ideal for functional scripting metaprogramming.
+
+This is an example of a third party module that uses macros and templates to
+translate text strings on unmodified NimScript:
+
+.. code-block:: nim
+
+  import nimterlingua
+  nimterlingua("translations.cfg")
+  echo "cat"  # Run with -d:RU becomes "kot", -d:ES becomes "gato", ...
+
+translations.cfg
+
+.. code-block:: none
+
+  [cat]
+  ES = gato
+  PT = minino
+  RU = kot
+  FR = chat
+
+
+* `Nimterlingua <https://nimble.directory/pkg/nimterlingua>`_
+
+
+Graceful Fallback
+-----------------
+
+Some features of compiled Nim may not work on NimScript,
+but often a graceful and seamless fallback degradation is used.
+
+See the following NimScript:
+
+.. code-block:: nim
+
+  if likely(true):
+    discard
+  elif unlikely(false):
+    discard
+
+  proc foo() {.compiletime.} = echo NimVersion
+
+  static:
+    echo CompileDate
+
+
+``likely()``, ``unlikely()``, ``static:`` and ``{.compiletime.}``
+will produce no code at all when run on NimScript,
+but still no error nor warning is produced and the code just works.
+
+Evolving Scripting language
+---------------------------
+
+NimScript evolves together with Nim,
+`occasionally new features might become available on NimScript <https://github.com/nim-lang/Nim/pulls?utf8=%E2%9C%93&q=nimscript>`_ ,
+adapted from compiled Nim or added as new features on both.
+
+Scripting Language with a Package Manager
+-----------------------------------------
+
+You can create your own modules to be compatible with NimScript,
+and check `Nimble <https://nimble.directory>`_
+to search for third party modules that may work on NimScript.
+
+DevOps Scripting
+----------------
+
+You can use NimScript to deploy to production, run tests, build projects, do benchmarks,
+generate documentation, and all kinds of DevOps/SysAdmin specific tasks.
+
+* `An example of a third party NimScript that can be used as a project-agnostic tool. <https://github.com/kaushalmodi/nim_config#list-available-tasks>`_