NimScript
Строго говоря, NimScript — это подмножество Nim, которое может быть вычислено встроенной виртуальной машиной (VM) Nim. Эта VM используется для функций вычисления функций Nim на этапе компиляции.
Исполняемый файл nim обрабатывает файлы конфигурации .nims в следующих директориях (в указанном порядке; более поздние файлы перезаписывают предыдущие настройки):
- Если переменная окружения
XDG_CONFIG_HOMEопределена,$XDG_CONFIG_HOME/nim/config.nimsили~/.config/nim/config.nims(POSIX) или%APPDATA%/nim/config.nims(Windows). Этот файл можно пропустить с помощью опции командной строки--skipUserCfg. -
$parentDir/config.nims, где$parentDirобозначает любую родительскую директорию пути к файлу проекта. Эти файлы можно пропустить с помощью опции командной строки--skipParentCfg. -
$projectDir/config.nims, где$projectDirобозначает путь к проекту. Этот файл можно пропустить с помощью опции командной строки--skipProjCfg. - Проект также может иметь специфичный для проекта файл конфигурации с именем
$project.nims, который находится в той же директории, что и$project.nim. Этот файл можно пропустить с помощью той же опции командной строки--skipProjCfg.
Для доступных процедур и подробностей реализации см. nimscript.
Ограничения
NimScript имеет некоторые ограничения, вызванные реализацией виртуальной машины (VM):
- Интерфейс внешних функций (FFI) Nim недоступен в NimScript. Это означает, что любой модуль стандартной библиотеки, который полагается на
importc, не может быть использован в VM. -
ptrоперации сложно эмулировать с помощью символического представления, используемого VM. Они доступны и широко протестированы, но всё ещё могут содержать ошибки. -
var Tаргументы функций полагаются наptrоперации внутри и могут быть проблематичными в некоторых случаях. - Поддержка более одного уровня
refобычно отсутствует (например, типref ref int). - Мультивиртуальные методы недоступны.
-
random.randomize()требует явногоint64в качестве аргумента; вы обязательно должны передать целое число Seed.
Модули стандартной библиотеки
Доступны как минимум следующие модули стандартной библиотеки:
- macros
- os
- strutils
- math
- distros
- sugar
- algorithm
- base64
- bitops
- chains
- colors
- complex
- htmlgen
- httpcore
- lenientops
- mersenne
- options
- parseutils
- punycode
- random
- stats
- strformat
- strmisc
- strscans
- unicode
- uri
- std/editdistance
- std/wordwrap
- std/sums
- parsecsv
- parsecfg
- parsesql
- xmlparser
- htmlparser
- ropes
- json
- parsejson
- strtabs
- unidecode
Помимо стандартного синтаксиса Nim (system модуль), NimScripts поддерживают процедуры и шаблоны, определённые в модуле nimscript также.
См. также:
NimScript как файл конфигурации
Переключатель командной строки --FOO записывается как switch("FOO") в NimScript. Аналогично, командная строка --FOO:VAL переводится в switch("FOO", "VAL").
Вот несколько примеров использования процедуры switch:
# command-line: --opt:size
switch("opt", "size")
# command-line: --define:foo or -d:foo
switch("define", "foo")
# command-line: --forceBuild
switch("forceBuild")
NimScripts также поддерживают шаблоны -- для удобства, которые выглядят как переключатели командной строки, записанные в файле NimScript так, как они есть. Таким образом, вышеприведенный пример можно переписать как:
--opt:size --define:foo --forceBuild
Примечание: В общем случае, переключатели define также могут быть установлены в NimScripts с помощью switch или --, как показано в приведенных выше примерах. Только переключатель release (-d:release) не может быть установлен в NimScripts.
NimScript как инструмент сборки
Шаблон task, который определяет модуль system, позволяет использовать файл NimScript в качестве инструмента сборки. Следующий пример определяет задачу build, которая является алиасом для команды c:
task build, "builds an example": setCommand "c"
Фактически, по соглашению, должны быть доступны следующие задачи:
| Задача | Описание |
|---|---|
help |
Список всех доступных задач NimScript вместе с их строками документации. |
build |
Сборка проекта с необходимым бэкендом (c, cpp или js). |
tests |
Запуск тестов, относящихся к проекту. |
bench |
Запуск бенчмарков, относящихся к проекту. |
Обратитесь к модулю distros для получения некоторой поддержки системных менеджеров пакетов операционной системы.
Интеграция с Nimble
См. README Nimble для получения дополнительной информации.
Отдельный NimScript
NimScript также может быть использован непосредственно как портативная замена файлам Bash и Batch. Используйте nim myscript.nims для запуска myscript.nims. Например, установка Nimble может быть выполнена с помощью этого простого скрипта:
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
В Unix вы также можете использовать shebang #!/usr/bin/env nim, если ваше имя файла заканчивается на .nims:
#!/usr/bin/env nim mode = ScriptMode.Silent echo "hello world"
Используйте #!/usr/bin/env -S nim --hints:off для отключения подсказок.
Преимущества
Многоплатформенность
Это многоплатформенный язык сценариев, который может работать там, где работает Nim, например, вы не можете запустить Batch или PowerShell в Linux или macOS, Bash для Linux может не работать на macOS, нет инструментов для тестирования единиц для Batch и т. д.
NimScript может определять платформу, операционную систему, архитектуру и даже дистрибутив Linux, на котором он работает, что позволяет одному скрипту поддерживать множество систем.
См. следующий (неполный) пример:
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"
Единый синтаксис
Синтаксис, стиль и остальная часть экосистемы такие же, как для компилируемого Nim, что означает, что разработчикам не нужно ничего нового изучать, нет переключения контекста.
Мощное метапрограммирование
NimScript может использовать шаблоны, макросы, типы, концепции, систему отслеживания эффектов и многое другое из Nim. Вы можете создавать модули, которые работают как с компилируемым Nim, так и с интерпретируемым NimScript.
func по-прежнему будет проверять побочные эффекты, debugEcho также работает как ожидается, что делает его идеальным для функционального метапрограммирования сценариев.
Это пример модуля стороннего разработчика, который использует макросы и шаблоны для перевода текстовых строк в немодифицированном NimScript:
import nimterlingua
nimterlingua("translations.cfg")
echo "cat" # Run with -d:RU becomes "kot", -d:ES becomes "gato", ...
translations.cfg
[cat] ES = gato PT = minino RU = kot FR = chat
Плавный откат
Некоторые функции компилируемого Nim могут не работать в NimScript, но часто используется плавный и бесшовный откат.
См. следующий NimScript:
if likely(true):
discard
elif unlikely(false):
discard
proc foo() {.compiletime.} = echo NimVersion
static:
echo CompileDate
likely(), unlikely(), static: и {.compiletime.} не будут генерировать никакого кода при запуске в NimScript, но при этом не будет сообщений об ошибках или предупреждениях, и код просто будет работать.
Эволюционирующий язык сценариев
NimScript развивается вместе с Nim, иногда новые функции могут стать доступными в NimScript, адаптированными из компилируемого Nim или добавленными в качестве новых функций как для компилируемого, так и для интерпретируемого Nim.
Язык сценариев с менеджером пакетов
Вы можете создавать собственные модули, совместимые с NimScript, и проверять Nimble для поиска модулей сторонних разработчиков, которые могут работать с NimScript.
DevOps-скрипты
Вы можете использовать NimScript для развертывания в продакшн, запуска тестов, сборки проектов, выполнения бенчмарков, генерации документации и всех видов задач DevOps/SysAdmin.
© 2006–2021 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/nims.html