Spec-Zone.ru › Nim

NimScript

Строго говоря, NimScript является подмножеством Nim, которое может быть обработано встроенной виртуальной машиной (ВМ) Nim. Эта ВМ используется для функций оценки функций Nim во время компиляции.

Исполняемый файл nim обрабатывает файлы конфигурации .nims в следующих директориях (в указанном порядке; более поздние файлы перезаписывают предыдущие настройки):

  1. Если переменная окружения XDG_CONFIG_HOME определена, $XDG_CONFIG_HOME/nim/config.nims или ~/.config/nim/config.nims (POSIX) или %APPDATA%/nim/config.nims (Windows). Этот файл можно пропустить с помощью опции командной строки --skipUserCfg.
  2. $parentDir/config.nims где $parentDir обозначает любую родительскую директорию пути к файлу проекта. Эти файлы можно пропустить с помощью опции командной строки --skipParentCfg.
  3. $projectDir/config.nims где $projectDir обозначает путь к проекту. Этот файл можно пропустить с помощью опции командной строки --skipProjCfg.
  4. Проект также может иметь файл конфигурации, специфичный для проекта, с именем $project.nims, который находится в той же директории, что и $project.nim. Этот файл можно пропустить с помощью той же опции командной строки --skipProjCfg.

Доступные процедуры и детали реализации см. в nimscript.

Ограничения

NimScript имеет некоторые ограничения, вызванные реализацией ВМ (виртуальной машины):

  • Интерфейс внешних функций (FFI) Nim недоступен в NimScript. Это означает, что любой модуль стандартной библиотеки, который зависит от importc, не может быть использован в ВМ.
  • ptr операции трудно эмулировать с использованием символического представления, используемого ВМ. Они доступны и тестируются в полном объёме, но остаются ошибки.
  • var T аргументы функций полагаются на ptr операции внутри и могут также быть проблематичными в некоторых случаях.
  • Более одного уровня ref обычно не поддерживается (например, тип ref ref int).
  • Мультивыражения недоступны.
  • random.randomize() требует явно переданного в качестве аргумента int64, вы обязательно должны передать целое число Seed.

Модули стандартной библиотеки

Доступны, как минимум, следующие модули стандартной библиотеки:

  • algorithm
  • base64
  • bitops
  • chains
  • colors
  • complex
  • distros
  • std/editdistance
  • htmlgen
  • htmlparser
  • httpcore
  • json
  • lenientops
  • macros
  • math
  • options
  • os
  • parsecfg
  • parsecsv
  • parsejson
  • parsesql
  • parseutils
  • punycode
  • random
  • ropes
  • std/setutils
  • stats
  • strformat
  • strmisc
  • strscans
  • strtabs
  • strutils
  • sugar
  • unicode
  • unidecode
  • uri
  • std/wordwrap
  • xmlparser

Помимо стандартного синтаксиса Nim (system модуль), NimScripts также поддерживают процедуры и шаблоны, определённые в модуле nimscript.

См. также:

  • Проверьте тесты для получения дополнительной информации о модулях, совместимых с NimScript

NimScript как файл конфигурации

Переключатель командной строки --FOO записывается как switch("FOO") в NimScript. Аналогично, командная строка --FOO:VAL преобразуется в switch("FOO", "VAL").

Вот несколько примеров использования процедуры switch.

# command-line: --opt:size
switch("opt", "size")
# command-line: --define:release or -d:release
switch("define", "release")
# command-line: --forceBuild
switch("forceBuild")
# command-line: --hint[Conf]:off or --hint:Conf:off
switch("hint", "[Conf]:off")

NimScripts также поддерживают шаблоны -- для удобства, которые выглядят как опции командной строки, записанные так же, как в файле NimScript. Таким образом, приведенный выше пример может быть переписан как:

--opt:size
--define:release
--forceBuild

Примечание: В общем случае переключатели define также можно установить в NimScripts, используя switch или --, как показано в примерах выше. Некоторые переключатели define, такие как -d:strip, -d:lto и -d:lto_incremental, не могут быть установлены в NimScripts.

NimScript как инструмент сборки

Шаблон task, который определяет модуль system, позволяет использовать файл NimScript в качестве инструмента сборки. Следующий пример определяет задачу build, которая является псевдонимом для команды c.

task build, "builds an example":
  setCommand "c"

Фактически, по соглашению должны быть доступны следующие задачи:

Задача Описание
help Отобразить все доступные задачи NimScript вместе с их строками документации.
build Сборка проекта с необходимым бэкендом (c, cpp или js).
tests Запуск тестов, относящихся к проекту.
bench Запуск бенчмарков, относящихся к проекту.

Обратите внимание на модуль distros для получения дополнительной поддержки системных менеджеров пакетов.

Интеграция с Nimble

Дополнительную информацию см. в руководстве по 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 e --hints:off для отключения подсказок и ослабления ограничения на расширение файла.

Преимущества

Многоплатформенность

Это многоплатформенный язык сценариев, который может работать там, где может работать Nim. Например, вы не можете запустить Batch или PowerShell в Linux или Mac, Bash для Linux может не работать в Mac, нет инструментов для тестирования единиц в Batch и т.д.

NimScript может определять платформу, операционную систему, архитектуру и даже дистрибутив Linux, на котором он работает, позволяя одному и тому же скрипту поддерживать множество систем.

Смотрите следующий (неполный) пример:

import std/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
IT = gatto
RU = kot
FR = chat
  • Nimterlingua

Плавный откат

Некоторые функции компилируемого 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 или добавленными как новые функции как в компилируемом, так и в интерпретируемом NimScript.

Язык сценариев с менеджером пакетов

Вы можете создавать собственные модули, совместимые с NimScript, и проверять Nimble для поиска модулей сторонних разработчиков, которые могут работать в NimScript.

DevOps-сценарии

Вы можете использовать NimScript для развертывания в производство, запуска тестов, сборки проектов, выполнения бенчмарков, генерации документации и других задач, связанных с DevOps/администрированием систем.

  • Пример NimScript сторонних разработчиков, который может использоваться как инструмент, независимый от проекта.

© 2006–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/nims.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API