Hello World - ponyatov/nimbook GitHub Wiki

Hello World

Каждое приложение поставляется в виде пакета. При необходимости вы можете скомпилировать простую программу, вызывая компилятор nim напрямую, но чаще всего программы используют дополнительные библиотеки = тоже пакеты, и их нужно скачать и скомпилировать вместе с вашей программой.

Для управления пакетами и компиляцией используется утилита nimble. Она сама отслеживает версии пакетов, закачивает свежие списки с сайта nimble.directory, обновляет библиотеки, отслеживает зависимости между файлами, и запускает компилятор nim только для изменившихся файлов. Для простых проектов её обычно достаточно, но в большинстве проектов используется еще множество других инструментов, поэтому лучше сразу научиться использовать nimble в связке с Makefile.

~$ find hello -t f
hello/src/hello.nim
hello/hello.nimble

В минимальный проект на языке Nim входят всего два файла:

  • project.nimble информация о проекте, обязательно его наличие как минимум для указания, какую версию компилятора и библиотек вам нужно
  • src/project.nim исходный код
  • Makefile необязательный файл управления проектом, более универсален, и покрывает то что не умеет nimble

hello.nimble

# Package | Пакет

version       = "0.1.0"
author        = "Dmitry Ponyatov <[email protected]>"
description   = "Hello World"
license       = "MIT"
srcDir        = "src"
bin           = @["hello"]

# Dependencies | Зависимости

## привязка к версии языка Nim
requires "nim >= 1.2.0"
## использование сторонней библиотеки, без указания версии
requires "ncurses"

Makefile

CWD     = $(CURDIR)
MODULE  = $(shell echo $(notdir $(CWD)) | tr "[:upper:]" "[:lower:]" )

SRC  = src/$(MODULE).nim
SRC += src/extra.nim

$(MODULE): $(SRC) $(MODULE).nimble src/nim.cfg Makefile
	echo $(SRC) | xargs -n1 -P0 nimpretty --indent:2
	nimble --cc:tcc build

src/hello.nim

when isMainModule:
  echo("Hello, World!")

шаблон приложения с логированием и вводом параметров командной строки

import logging
let log = newConsoleLogger(fmtStr = "[$date $time] - $levelname: ")
addHandler(log)

import os
import memfiles as mmap

proc main =
  let argv = @[os.getAppFilename()] & os.commandLineParams()
  for i in pairs(argv):
    info "argv[", i.key, "] = <", i.val, ">"
  debug "mmap ", argv[1]
  src = mmap.open(argv[1])
  defer: src.close()

when isMainModule: main()
./nyp nyp.py nyp.ini
[2020-06-28 11:11:37] - INFO: argv[0] = </home/ponyatov/nimbook/nyp/nyp>
[2020-06-28 11:11:37] - INFO: argv[1] = <nyp.py>
[2020-06-28 11:11:37] - INFO: argv[2] = <nyp.ini>
[2020-06-28 11:11:37] - DEBUG: mmap nyp.py

логирование

⚠️ **GitHub.com Fallback** ⚠️