Spec-Zone.ru › Nim 1

NimScript

Строго говоря, NimScript — это подмножество Nim, которое может быть вычислено встроенной виртуальной машиной (VM) Nim. Эта VM используется для функций вычисления функций 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 имеет некоторые ограничения, вызванные реализацией виртуальной машины (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.

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
  • 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 или добавленными в качестве новых функций как для компилируемого, так и для интерпретируемого Nim.

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

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

DevOps-скрипты

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

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

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

Spec-Zone.ru

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