system
Исходный кодРедактироватьДля корректной работы компилятора необходим модуль System, а модуль System, в свою очередь, зависит от компилятора. Большинство функций, перечисленных здесь, используют специальную магию компилятора.
Каждый модуль неявно импортирует модуль System; его не нужно указывать явно. Из-за этого не может быть пользовательского модуля с именем system.
Модуль System
Модуль System импортирует несколько отдельных модулей, и их документация находится в отдельных файлах:
Ниже приведён краткий обзор наиболее часто используемых функций из модуля system. Названия функций в таблицах ниже являются кликабельными и ведут к полной документации функции.
Доступно намного больше функций, чем перечисленные в этом обзоре. Используйте таблицу содержания слева и/или Ctrl+F для навигации по данному модулю.
Строки и символы
| Процедура | Использование |
|---|---|
| len(s) | Возвращает длину строки |
| chr(i) | Преобразует int в диапазоне 0..255 в символ |
| ord(c) | Возвращает int значение символа |
| a & b | Конкатенация двух строк |
| s.add(c) | Добавление символа в строку |
| $ | Преобразование различных типов в строку |
См. также:
- модуль strutils для общих функций обработки строк
- модуль strformat для интерполяции и форматирования строк
- модуль unicode для обработки Unicode UTF-8
-
strscans для
scanfиscanpмакросов, которые предлагают более удобный способ извлечения подстрок, чем регулярные выражения - модуль strtabs для эффективных хеш-таблиц (словарей в некоторых языках программирования), сопоставляющих строки со строками
Последовательности (Seqs)
| Процедура | Использование |
|---|---|
| newSeq | Создание новой последовательности заданной длины |
| newSeqOfCap | Создание новой последовательности с нулевой длиной и заданной ёмкостью |
| setLen | Установка длины последовательности |
| len | Возвращение длины последовательности |
| @ | Преобразование массива в последовательность |
| add | Добавление элемента в последовательность |
| insert | Вставка элемента в определённую позицию |
| delete | Удаление элемента с сохранением порядка элементов (операция O(n)) |
| del | Удаление элемента, не сохраняя порядок (O(1)) |
| pop | Удаление и возврат последнего элемента последовательности |
| x & y | Конкатенация двух последовательностей |
| x[a .. b] | Срезы последовательности (обе границы включены) |
| x[a .. ^b] | Срезы последовательности, но b — это индекс в обратном порядке (обе границы включены) |
| x[a ..< b] | Срез последовательности (верхняя граница исключена) |
См. также:
- модуль sequtils для операций над типами контейнеров (включая строки)
- модуль json для структуры, допускающей гетерогенные члены
- модуль lists для связанных списков
Множества
Встроенные битовые множества.
| Процедура | Использование |
|---|---|
| incl | Включение элемента y в множество x
|
| excl | Исключение элемента y из множества x
|
| card | Возвращает мощность множества, то есть количество элементов |
| a * b | Пересечение |
| a + b | Объединение |
| a - b | Разность |
| contains | Проверка наличия элемента в множестве |
| a < b | Проверка, является ли a подмножеством b
|
См. также:
- модуль setutils для удобных функций работы с битовыми множествами
- модуль sets для хеш-множеств
- модуль intsets для эффективных множеств целых чисел
Числа
| Процедура | Использование | Также известно как (на других языках) |
|---|---|---|
| div | Целочисленное деление | // |
| mod | Целочисленное остаток от деления (modulo) | % |
| shl | Сдвиг влево | << |
| shr | Сдвиг вправо | >> |
| ashr | Арифметический сдвиг вправо | |
| and | Побитовое and
|
& |
| or | Побитовое or
|
| |
| xor | Побитовое xor
|
^ |
| not | Побитовое not (дополнение) |
~ |
| toInt | Преобразование числа с плавающей запятой в int
|
|
| toFloat | Преобразование целого числа в float
|
См. также:
- модуль math для математических операций, таких как тригонометрические функции, логарифмы, квадратные и кубические корни и т. д.
- модуль complex для операций над комплексными числами
- модуль rationals для рациональных чисел
Порядковые типы (Ordinals)
Тип Ordinal включает целые числа, булевы значения, символы и перечисления, а также их подтипы.
| Процедура | Использование |
|---|---|
| succ | Преемник значения |
| pred | Предшественник значения |
| inc | Инкрементирование порядкового типа |
| dec | Декрементирование порядкового типа |
| high | Возвращает наибольшее возможное значение |
| low | Возвращает наименьшее возможное значение |
| ord | Возвращает int значение порядкового значения |
Разное
| Процедура | Использование |
|---|---|
| is | Проверка, являются ли два аргумента одного типа |
| isnot | Отрицание is
|
| != | Не равно |
| addr | Получение адреса местоположения в памяти |
| T and F | Булево and
|
| T or F | Булево or
|
| T xor F | Булево xor (исключающее ИЛИ) |
| not T | Булево not
|
| a[^x] | Получение элемента по индексу в обратном порядке x
|
| a .. b | Двухместный срез, формирующий интервал [a, b]
|
| a ..^ b | Интервал [a, b], но b как индекс в обратном порядке |
| a ..< b | Интервал [a, b) (верхняя граница исключена) |
| runnableExamples | Создание тестируемой документации |
Поддержка каналов для потоков.
Примечание: Это часть модуля system. Не импортируйте его напрямую. Для активации поддержки потоков используйте --threads:on переключатель командной строки.
Примечание: Каналы предназначены для типа Thread. Они нестабильны при использовании с spawn.
Примечание: Текущая реализация передачи сообщений не работает с циклическими структурами данных.
Примечание: Каналы не могут передаваться между потоками. Используйте глобальные переменные или передавайте их с помощью ptr.
Пример
Ниже приведён простой пример использования каналов двумя способами: блокирующий и неблокирующий.
# Be sure to compile with --threads:on.
# The channels and threads modules are part of system and should not be
# imported.
import std/os
# Channels can either be:
# - declared at the module level, or
# - passed to procedures by ptr (raw pointer) -- see note on safety.
#
# For simplicity, in this example a channel is declared at module scope.
# Channels are generic, and they include support for passing objects between
# threads.
# Note that objects passed through channels will be deeply copied.
var chan: Channel[string]
# This proc will be run in another thread using the threads module.
proc firstWorker() =
chan.send("Hello World!")
# This is another proc to run in a background thread. This proc takes a while
# to send the message since it sleeps for 2 seconds (or 2000 milliseconds).
proc secondWorker() =
sleep(2000)
chan.send("Another message")
# Initialize the channel.
chan.open()
# Launch the worker.
var worker1: Thread[void]
createThread(worker1, firstWorker)
# Block until the message arrives, then print it out.
echo chan.recv() # "Hello World!"
# Wait for the thread to exit before moving on to the next example.
worker1.joinThread()
# Launch the other worker.
var worker2: Thread[void]
createThread(worker2, secondWorker)
# This time, use a non-blocking approach with tryRecv.
# Since the main thread is not blocked, it could be used to perform other
# useful work while it waits for data to arrive on the channel.
while true:
let tried = chan.tryRecv()
if tried.dataAvailable:
echo tried.msg # "Another message"
break
echo "Pretend I'm doing useful work..."
# For this example, sleep in order not to flood stdout with the above
# message.
sleep(400)
# Wait for the second thread to exit before cleaning up the channel.
worker2.joinThread()
# Clean up the channel.
chan.close() Пример вывода
Программа должна вывести что-то подобное, но имейте в виду, что точные результаты могут отличаться в реальной среде:
Hello World! Pretend I'm doing useful work... Pretend I'm doing useful work... Pretend I'm doing useful work... Pretend I'm doing useful work... Pretend I'm doing useful work... Another message
Безопасная передача каналов
Обратите внимание, что при передаче объектов в процедуры в другом потоке по указателю (например, через аргумент потока), объекты, созданные с помощью стандартного аллокатора, будут использовать локальную память потока, управляемую сборщиком мусора. Поэтому обычно безопаснее хранить объекты каналов в глобальных переменных (как в приведённом выше примере), в таком случае они будут использовать общую кучу всего процесса (защищённую от одновременного доступа потоков).
Однако, можно вручную выделять общую память для каналов, например, используя system.allocShared0 и передавать эти указатели в качестве аргументов потока:
proc worker(channel: ptr Channel[string]) =
let greeting = channel[].recv()
echo greeting
proc localChannelExample() =
# Use allocShared0 to allocate some shared-heap memory and zero it.
# The usual warnings about dealing with raw pointers apply. Exercise caution.
var channel = cast[ptr Channel[string]](
allocShared0(sizeof(Channel[string]))
)
channel[].open()
# Create a thread which will receive the channel as an argument.
var thread: Thread[ptr Channel[string]]
createThread(thread, worker, channel)
channel[].send("Hello from the main thread!")
# Clean up resources.
thread.joinThread()
channel[].close()
deallocShared(channel)
localChannelExample() # "Hello from the main thread!" Импорты
- исключения, с момента, ctypes, ctypes, sysatomics, ansi_c, память, syslocks, threadtypes, утверждения, итераторы, coro_detection, dollars, typedthreads, miscdollars, stacktraces, countbits_impl, syslocks, sysatomics, digitsutils, syslocks, digitsutils, repr_v2, widestrs, syncio
Типы
AllocStats = object
- Исходный код Изменить
any {....deprecated: "Deprecated since v1.5; Use auto instead.".} = distinct auto- Устарело; Используйте
autoвместо этого. См. https://github.com/nim-lang/RFCs/issues/281 Исходный код Изменить array[I; T] {.magic: "Array".}- Обобщённый тип для создания массивов фиксированной длины. Исходный код Изменить
auto {.magic: Expr.}- Метатип для автоматического определения типа. Исходный код Изменить
BackwardsIndex = distinct int
- Тип, созданный
^для обращённого доступа к элементам массива. (См. шаблон ^) Исходный код Изменить bool {.magic: "Bool".} = enum false = 0, true = 1- Встроенный булевый тип. Исходный код Изменить
byte = uint8
- Это псевдоним для
uint8, представляющего собой целое без знака, 8 бит в ширину. Исходный код Изменить CatchableError = object of Exception
- Абстрактный класс для всех исключений, которые можно перехватить. Исходный код Изменить
Channel[TMsg] {....gcsafe.} = RawChannel- канал для межпотоковой коммуникации Исходный код Изменить
char {.magic: Char.}- Встроенный 8-битный символьный тип (без знака). Исходный код Изменить
csize {.importc: "size_t", nodecl, ...deprecated: "use `csize_t` instead".} = int- Это не то же самое, что
size_tв C. Не используйте его. Исходный код Изменить cstring {.magic: Cstring.}- Встроенный тип cstring (совместимая строка). Исходный код Изменить
Defect = object of Exception
- Абстрактный базовый класс для всех исключений, которые поднимает исполняемый код Nim, но которые строго нельзя перехватить, так как они также могут быть сопоставлены с операцией
quit/trap/exit. Исходный код Изменить Endianness = enum littleEndian, bigEndian
- Тип, описывающий порядок байтов процессора. Исходный код Изменить
Exception {.compilerproc, magic: "Exception".} = object of RootObj parent*: ref Exception ## Parent exception (can be used as a stack). name*: cstring ## The exception's name is its Nim identifier. ## This field is filled automatically in the ## `raise` statement. msg* {.exportc: "message".}: string ## The exception's message. Not ## providing an exception message ## is bad style. when defined(js): trace*: string else: trace*: seq[StackTraceEntry]-
Базовый класс исключений.
Каждое исключение должно наследоваться от
Исходный код ИзменитьException. См. полную иерархию исключений. float {.magic: Float.}- Типовое значение с плавающей точкой по умолчанию. Исходный код Изменить
float32 {.magic: Float32.}- 32-битный тип с плавающей точкой. Исходный код Изменить
float64 {.magic: Float.}- 64-битный тип с плавающей точкой. Исходный код Изменить
ForeignCell = object data*: pointer
- Исходный код Изменить
ForLoopStmt {.compilerproc.} = object- Специальный тип, который отмечает макрос как макрос цикла for. См. "Макрос цикла For". Исходный код Изменить
GC_Strategy = enum gcThroughput, ## optimize for throughput gcResponsiveness, ## optimize for responsiveness (default) gcOptimizeTime, ## optimize for speed gcOptimizeSpace ## optimize for memory footprint
- Стратегия, которую должен использовать сборщик мусора для приложения. Исходный код Изменить
HSlice[T; U] = object a*: T ## The lower bound (inclusive). b*: U ## The upper bound (inclusive).
- Тип "гетерогенного" среза. Исходный код Изменить
int {.magic: Int.}- Целочисленный тип по умолчанию; разрядность зависит от архитектуры, но всегда совпадает с размером указателя. Исходный код Изменить
int8 {.magic: Int8.}- Целочисленный тип со знаком, 8 бит. Исходный код Изменить
int16 {.magic: Int16.}- Целочисленный тип со знаком, 16 бит. Исходный код Изменить
int32 {.magic: Int32.}- Целочисленный тип со знаком, 32 бит. Исходный код Изменить
int64 {.magic: Int64.}- Целочисленный тип со знаком, 64 бит. Исходный код Изменить
iterable[T] {.magic: IterableType.}- Представляет выражение, которое возвращает
TИсходный код Изменить JsRoot = ref object of RootObj
- Корневой тип иерархии объектов JavaScript Исходный код Изменить
lent[T] {.magic: "BuiltinType".}- Исходный код Изменить
Natural = range[0 .. high(int)]
- это
intтип, изменяющийся от нуля до максимального значенияint. Этот тип часто полезен для документации и отладки. Исходный код Изменить NimNode {.magic: "PNimrodNode".} = ref NimNodeObj- Представляет узел AST Nim. Макросы работают с этим типом. Исходный код Изменить
NimSeqV2[T] = object
- Исходный код Изменить
openArray[T] {.magic: "OpenArray".}- Обобщённый тип для создания открытых массивов. Открытые массивы реализуются как указатель на данные массива и поле длины. Исходный код Редактировать
Ordinal[T] {.magic: Ordinal.}- Обобщённый порядковый тип. Включает целые числа, булевы значения, символы и перечисления, а также их подтипы. См. также
SomeOrdinal. Исходный код Редактировать owned[T] {.magic: "BuiltinType".}- Конструктор типа для маркировки ссылок/указателей или замыканий как
owned. Исходный код Редактировать PFrame = ptr TFrame
- Представляет собой кадр выполнения стека вызовов; часть API отладчика. Исходный код Редактировать
pointer {.magic: Pointer.}- Встроенный тип указателя, используйте оператор
addrдля получения указателя на переменную. Исходный код Редактировать Positive = range[1 .. high(int)]
- Это тип
int, изменяющийся от единицы до максимального значенияint. Этот тип часто полезен для документирования и отладки. Исходный код Редактировать ptr[T] {.magic: Pointer.}- Встроенный обобщённый тип неотслеживаемого указателя. Исходный код Редактировать
range[T] {.magic: "Range".}- Обобщённый тип для построения типов диапазонов. Исходный код Редактировать
ref[T] {.magic: Pointer.}- Встроенный обобщённый тип отслеживаемого указателя. Исходный код Редактировать
RootEffect {.compilerproc.} = object of RootObj-
Базовый класс эффекта.
Каждый эффект должен наследоваться от
Исходный код РедактироватьRootEffect, если вы не знаете, что делаете. RootObj {.compilerproc, inheritable.} = object-
Корень иерархии объектов Nim.
Объекты должны наследоваться от
Исходный код РедактироватьRootObjили одного из его потомков. Однако допускаются и объекты без предков. RootRef = ref RootObj
- Ссылка на
RootObj. Исходный код Редактировать seq[T] {.magic: "Seq".}- Обобщённый тип для создания последовательностей. Исходный код Редактировать
set[T] {.magic: "Set".}- Обобщённый тип для создания битовых множеств. Исходный код Редактировать
sink[T] {.magic: "BuiltinType".}- Исходный код Редактировать
Slice[T] = HSlice[T, T]
- Псевдоним для
HSlice[T, T]. Исходный код Редактировать SomeFloat = float | float32 | float64
- Класс типов, соответствующий всем типам чисел с плавающей запятой. Исходный код Редактировать
SomeInteger = SomeSignedInt | SomeUnsignedInt
- Класс типов, соответствующий всем целым типам. Исходный код Редактировать
SomeNumber = SomeInteger | SomeFloat
- Класс типов, соответствующий всем числовым типам. Исходный код Редактировать
SomeOrdinal = int | int8 | int16 | int32 | int64 | bool | enum | uint | uint8 | uint16 | uint32 | uint64- Класс типов, соответствующий всем порядковым типам; однако это включает перечисления с пропусками. См. также
Ordinal. Исходный код Редактировать SomeSignedInt = int | int8 | int16 | int32 | int64
- Класс типов, соответствующий всем целым типам со знаком. Исходный код Редактировать
SomeUnsignedInt = uint | uint8 | uint16 | uint32 | uint64
- Класс типов, соответствующий всем целым типам без знака. Исходный код Редактировать
StackTraceEntry = object procname*: cstring ## Name of the proc that is currently executing. line*: int ## Line number of the proc that is currently executing. filename*: cstring ## Filename of the proc that is currently executing. when NimStackTraceMsgs: frameMsg*: string ## When a stacktrace is generated in a given frame and ## rendered at a later time, we should ensure the stacktrace ## data isn't invalidated; any pointer into PFrame is ## subject to being invalidated so shouldn't be stored. when defined(nimStackTraceOverride): programCounter*: uint ## Program counter - will be used to get the rest of the info, ## when `$` is called on this type. We can't use ## "cuintptr_t" in here. procnameStr*, filenameStr*: string ## GC-ed alternatives to "procname" and "filename"- В режиме отладки исключения хранят трассировку стека, которая привела к ним.
StackTraceEntry— это одна запись трассировки стека. Исходный код Редактировать static[T] {.magic: "Static".}-
Метатип, представляющий все значения, которые могут быть вычислены во время компиляции.
Преобразование типа
Исходный код Редактироватьstatic(x)может быть использовано для принудительного вычисления во время компиляции данного выраженияx. string {.magic: String.}- Встроенный тип строки. Исходный код Редактировать
TaintedString {....deprecated: "Deprecated since 1.5".} = string- Исходный код Редактировать
TFrame {.importc, nodecl, final.} = object prev*: PFrame ## Previous frame; used for chaining the call stack. procname*: cstring ## Name of the proc that is currently executing. line*: int ## Line number of the proc that is currently executing. filename*: cstring ## Filename of the proc that is currently executing. len*: int16 ## Length of the inspectable slots. calldepth*: int16 ## Used for max call depth checking. when NimStackTraceMsgs: frameMsgLen*: int ## end position in frameMsgBuf for this frame.- Сам кадр. Исходный код Редактировать
type[T] {.magic: "Type".}-
Метатип, представляющий тип всех значений типа.
Преобразование
Исходный код Редактироватьtype(x)может быть использовано для получения типа данного выраженияx. typed {.magic: Stmt.}- Метатип для обозначения выражения, которое разрешено (для шаблонов). Исходный код Редактировать
typedesc {.magic: TypeDesc.}- Метатип для обозначения описания типа. Исходный код Редактировать
TypeOfMode = enum typeOfProc, ## Prefer the interpretation that means `x` is a proc call. typeOfIter ## Prefer the interpretation that means `x` is an iterator call.
- Возможные режимы
typeof. Исходный код Редактировать uint {.magic: UInt.}- Тип целого числа по умолчанию без знака. Исходный код Редактировать
uint8 {.magic: UInt8.}- Тип целого числа без знака 8 бит. Исходный код Редактировать
uint16 {.magic: UInt16.}- Беззнаковый 16-битный целочисленный тип. Исходный код Изменить
uint32 {.magic: UInt32.}- Беззнаковый 32-битный целочисленный тип. Исходный код Изменить
uint64 {.magic: UInt64.}- Беззнаковый 64-битный целочисленный тип. Исходный код Изменить
UncheckedArray[T] {.magic: "UncheckedArray".}- Исходный код Изменить
untyped {.magic: Expr.}- Метатип, обозначающий выражение, которое не разрешено (для шаблонов). Исходный код Изменить
varargs[T] {.magic: "Varargs".}- Общий тип для создания типа varargs. Исходный код Изменить
void {.magic: "VoidType".}- Метатип, обозначающий отсутствие любого типа. Исходный код Изменить
Переменные
errorMessageWriter: (proc (msg: string) {....tags: [WriteIOEffect], gcsafe, nimcall.})- Функция, которая будет вызвана вместо
stdmsg.writeпри выводе трассировки стека. Нестабильный API. Исходный код Изменить globalRaiseHook: proc (e: ref Exception): bool {.nimcall, ...gcsafe.}- С помощью этого обработчика можно влиять на обработку исключений на глобальном уровне. Если не пусто, каждая инструкция 'raise' вызывает этот обработчик.Предупреждение: Обычный код приложения никогда не должен устанавливать этот обработчик! Вы должны понимать, что вы делаете, устанавливая его.
Если
Исходный код ИзменитьglobalRaiseHookвозвращает false, исключение перехватывается и не распространяется дальше по стеку вызовов. localRaiseHook {.threadvar.}: proc (e: ref Exception): bool {.nimcall, ...gcsafe.}- С помощью этого обработчика можно влиять на обработку исключений на уровне потока. Если не пусто, каждая инструкция 'raise' вызывает этот обработчик.Предупреждение: Обычный код приложения никогда не должен устанавливать этот обработчик! Вы должны понимать, что вы делаете, устанавливая его.
Если
Исходный код ИзменитьlocalRaiseHookвозвращает false, исключение перехватывается и не распространяется дальше по стеку вызовов. nimThreadDestructionHandlers {.threadvar.}: seq[ proc () {.closure, ...gcsafe, raises: [].}]- Исходный код Изменить
onUnhandledException: (proc (errorMsg: string) {.nimcall, ...gcsafe.})-
Установите этот обработчик ошибок, чтобы переопределить стандартное поведение при возникновении необработанного исключения.
По умолчанию трассировка стека записывается в
Исходный код Изменитьstderrи затем вызываетсяquit(1). Нестабильный API. outOfMemHook: proc () {.nimcall, ...tags: [], gcsafe, raises: [].}-
Установите эту переменную, чтобы указать процедуру, которая должна быть вызвана в случае события недостатка памяти. Стандартный обработчик записывает сообщение об ошибке и завершает программу.
outOfMemHookможет быть использован для поднятия исключения в случае OOM следующим образом:var gOutOfMem: ref EOutOfMemory new(gOutOfMem) # need to be allocated *before* OOM really happened! gOutOfMem.msg = "out of memory" proc handleOOM() = raise gOutOfMem system.outOfMemHook = handleOOM
Если обработчик не поднимает исключение, обычный поток управления продолжается, и программа завершается.
Исходный код Изменить programResult {.compilerproc, exportc: "nim_program_result".}: int- устарело, используйте
quitилиexitprocs.getProgramResult,exitprocs.setProgramResult. Исходный код Изменить unhandledExceptionHook: proc (e: ref Exception) {.nimcall, ...tags: [], gcsafe, raises: [].}- Установите эту переменную, чтобы указать процедуру, которая должна быть вызвана в случае события необработанного исключения. Стандартный обработчик выводит сообщение об ошибке и завершает программу, за исключением случаев использования
--os:anyИсходный код Изменить
Константы
nimvm {.magic: "Nimvm", compileTime.}: bool = false- Может быть использован только в
whenвыражении. Он равен true в контексте Nim VM и false в противном случае. Исходный код Изменить
Константы
appType {.magic: "AppType".}: string = ""- Строка, описывающая тип приложения. Возможные значения:
"console","gui","lib". Исходный код Изменить CompileDate {.magic: "CompileDate".}: string = "0000-00-00"- Дата компиляции (в UTC) в виде строки формата
YYYY-MM-DD. Работает благодаря магии компилятора. Исходный код Изменить CompileTime {.magic: "CompileTime".}: string = "00:00:00"- Время компиляции (в UTC) в виде строки формата
HH:MM:SS. Работает благодаря магии компилятора. Исходный код Изменить cpuEndian {.magic: "CpuEndian".}: Endianness = littleEndian- Порядок байтов целевого процессора. Эта информация полезна только для низкоуровневого кода. Работает благодаря магии компилятора. Исходный код Изменить
hostCPU {.magic: "HostCPU".}: string = ""-
Строка, описывающая процессор хоста.
Возможные значения:
Исходный код Изменить"i386","alpha","powerpc","powerpc64","powerpc64el","sparc","amd64","mips","mipsel","arm","arm64","mips64","mips64el","riscv32","riscv64","loongarch64". hostOS {.magic: "HostOS".}: string = ""-
Строка, описывающая операционную систему хоста.
Возможные значения:
Исходный код Изменить"windows","macosx","linux","netbsd","freebsd","openbsd","solaris","aix","haiku","standalone". Inf = 0x7FF0000000000000'f64
- Содержит значение положительной бесконечности в формате IEEE для чисел с плавающей запятой. Исходный код Изменить
isMainModule {.magic: "IsMainModule".}: bool = false- Истинно только при обращении в основном модуле. Работает благодаря магии компилятора. Полезно для встраивания тестового кода в модуль. Исходный код Изменить
NaN = 0x7FF7FFFFFFFFFFFF'f64
-
Содержит значение Не число (NaN) в формате IEEE для чисел с плавающей запятой.
Обратите внимание, что вы не можете сравнивать число с плавающей запятой с этим значением и ожидать разумного результата. Используйте процедуру
Исходный код ИзменитьisNaNилиclassifyв модуле math для проверки NaN. NegInf = 0xFFF0000000000000'f64
- Содержит значение отрицательной бесконечности в формате IEEE для чисел с плавающей запятой. Исходный код Изменить
NimMajor {.intdefine.}: int = 2-
Главный номер версии Nim. Пример:
when (NimMajor, NimMinor, NimPatch) >= (1, 3, 1): discard
Исходный код Изменить NimMinor {.intdefine.}: int = 2- Вспомогательный номер версии Nim. Нечетное значение для devel, четное для релизов. Исходный код Изменить
NimPatch {.intdefine.}: int = 0- Номер исправления версии Nim. Нечетное значение для devel, четное для релизов. Исходный код Изменить
NimVersion: string = "2.2.0"
- Версия Nim в виде строки. Исходный код Изменить
off = false
- Псевдоним для
false. Исходный код Изменить on = true
- Псевдоним для
true. Исходный код Изменить QuitFailure = 1
- Значение, которое следует передать в quit для обозначения ошибки. Исходный код Изменить
QuitSuccess = 0
- Значение, которое следует передать в quit для обозначения успеха. Исходный код Изменить
Процедуры
proc `%%`(x, y: int): int {.inline, ...raises: [], tags: [], forbids: [].}-
Обрабатывает
xиyкак беззнаковые и вычисляет модульxиy.Результат усекается для соответствия результату. Это реализует арифметику по модулю. Ошибки переполнения невозможны.
Исходный код Изменить proc `%%`(x, y: int8): int8 {.inline, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `%%`(x, y: int16): int16 {.inline, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `%%`(x, y: int32): int32 {.inline, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `%%`(x, y: int64): int64 {.inline, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `&`(x, y: char): string {.magic: "ConStrStr", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Объединяет символы
xиyв строку.assert('a' & 'b' == "ab")Исходный код Изменить proc `&`(x, y: string): string {.magic: "ConStrStr", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Объединяет строки
xиy.assert("ab" & "cd" == "abcd")Исходный код Изменить proc `&`(x: char; y: string): string {.magic: "ConStrStr", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Объединяет
xсоy.assert('a' & "bc" == "abc")Исходный код Изменить proc `&`(x: string; y: char): string {.magic: "ConStrStr", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Объединяет
xсоy.assert("ab" & 'c' == "abc")Исходный код Изменить proc `&`[T](x, y: sink seq[T]): seq[T] {.noSideEffect.}-
Объединяет две последовательности.
Требуется копирование последовательностей.
assert(@[1, 2, 3, 4] & @[5, 6] == @[1, 2, 3, 4, 5, 6])
См. также:
Исходный код Изменить proc `&`[T](x: sink seq[T]; y: sink T): seq[T] {.noSideEffect.}-
Добавляет элемент y в конец последовательности.
Требуется копирование последовательности.
assert(@[1, 2, 3] & 4 == @[1, 2, 3, 4])
См. также:
Исходный код Изменить proc `&`[T](x: sink T; y: sink seq[T]): seq[T] {.noSideEffect.}-
Вставляет элемент x в начало последовательности.
Требуется копирование последовательности.
assert(1 & @[2, 3, 4] == @[1, 2, 3, 4])
Исходный код Изменить proc `&=`(x: var string; y: string) {.magic: "AppendStrStr", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Добавляет в строку на месте.
var a = "abc" a &= "de" # a <- "abcde"
Исходный код Изменить proc `*`(x, y: float): float {.magic: "MulF64", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `*`(x, y: float32): float32 {.magic: "MulF64", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `*`(x, y: int): int {.magic: "MulI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Бинарный
*оператор для целого числа. Исходный код Изменить proc `*`(x, y: int8): int8 {.magic: "MulI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `*`(x, y: int16): int16 {.magic: "MulI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `*`(x, y: int32): int32 {.magic: "MulI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `*`(x, y: int64): int64 {.magic: "MulI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `*`(x, y: uint): uint {.magic: "MulU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Бинарный
*оператор для беззнаковых целых чисел. Исходный код Изменить proc `*`(x, y: uint8): uint8 {.magic: "MulU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `*`(x, y: uint16): uint16 {.magic: "MulU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `*`(x, y: uint32): uint32 {.magic: "MulU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `*`(x, y: uint64): uint64 {.magic: "MulU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
func `*`[T](x, y: set[T]): set[T] {.magic: "MulSet", ...raises: [], tags: [], forbids: [].}- Этот оператор вычисляет пересечение двух множеств.
Пример:
assert {1, 2, 3} * {2, 3, 4} == {2, 3}Исходный код Изменить proc `*%`(x, y: int): int {.inline, ...raises: [], tags: [], forbids: [].}-
Обрабатывает
xиyкак беззнаковые и умножает их.Результат усекается для соответствия результату. Это реализует арифметику по модулю. Ошибки переполнения невозможны.
Исходный код Изменить proc `*%`(x, y: int8): int8 {.inline, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `*%`(x, y: int16): int16 {.inline, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `*%`(x, y: int32): int32 {.inline, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `*%`(x, y: int64): int64 {.inline, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `*=`[T: float | float32 | float64](x: var T; y: T) {.inline, noSideEffect.}- Умножает на месте число с плавающей точкой. Исходный код Редактировать
proc `*=`[T: SomeInteger](x: var T; y: T) {.inline, noSideEffect.}- Бинарный оператор
*=для целых чисел. Исходный код Редактировать proc `+`(x, y: float): float {.magic: "AddF64", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `+`(x, y: float32): float32 {.magic: "AddF64", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `+`(x, y: int): int {.magic: "AddI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Бинарный оператор
+для целого числа. Исходный код Редактировать proc `+`(x, y: int8): int8 {.magic: "AddI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `+`(x, y: int16): int16 {.magic: "AddI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `+`(x, y: int32): int32 {.magic: "AddI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `+`(x, y: int64): int64 {.magic: "AddI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `+`(x, y: uint): uint {.magic: "AddU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Бинарный оператор
+для беззнаковых целых чисел. Исходный код Редактировать proc `+`(x, y: uint8): uint8 {.magic: "AddU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `+`(x, y: uint16): uint16 {.magic: "AddU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `+`(x, y: uint32): uint32 {.magic: "AddU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `+`(x, y: uint64): uint64 {.magic: "AddU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `+`(x: float): float {.magic: "UnaryPlusF64", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `+`(x: float32): float32 {.magic: "UnaryPlusF64", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `+`(x: int): int {.magic: "UnaryPlusI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Унарный оператор
+для целого числа. Не оказывает никакого влияния. Исходный код Редактировать proc `+`(x: int8): int8 {.magic: "UnaryPlusI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `+`(x: int16): int16 {.magic: "UnaryPlusI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `+`(x: int32): int32 {.magic: "UnaryPlusI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `+`(x: int64): int64 {.magic: "UnaryPlusI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
func `+`[T](x, y: set[T]): set[T] {.magic: "PlusSet", ...raises: [], tags: [], forbids: [].}- Этот оператор вычисляет объединение двух множеств.
Пример:
assert {1, 2, 3} + {2, 3, 4} == {1, 2, 3, 4}Исходный код Редактировать proc `+%`(x, y: int): int {.inline, ...raises: [], tags: [], forbids: [].}-
Обращается с
xиyкак с беззнаковыми и складывает их.Результат усекается для соответствия результату. Это реализует модульную арифметику. Ошибки переполнения невозможны.
Исходный код Редактировать proc `+%`(x, y: int8): int8 {.inline, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `+%`(x, y: int16): int16 {.inline, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `+%`(x, y: int32): int32 {.inline, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `+%`(x, y: int64): int64 {.inline, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `+=`[T: float | float32 | float64](x: var T; y: T) {.inline, noSideEffect.}- Увеличивает на месте число с плавающей точкой. Исходный код Редактировать
proc `+=`[T: SomeInteger](x: var T; y: T) {.magic: "Inc", noSideEffect, ...raises: [], tags: [], forbids: [].}- Увеличивает целое число. Исходный код Редактировать
proc `-`(a, b: AllocStats): AllocStats {....raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `-`(x, y: float): float {.magic: "SubF64", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `-`(x, y: float32): float32 {.magic: "SubF64", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `-`(x, y: int): int {.magic: "SubI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Бинарный
-оператор для целого числа. Исходный код Редактировать proc `-`(x, y: int8): int8 {.magic: "SubI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `-`(x, y: int16): int16 {.magic: "SubI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `-`(x, y: int32): int32 {.magic: "SubI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `-`(x, y: int64): int64 {.magic: "SubI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `-`(x, y: uint): uint {.magic: "SubU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Бинарный
-оператор для беззнаковых целых чисел. Исходный код Редактировать proc `-`(x, y: uint8): uint8 {.magic: "SubU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `-`(x, y: uint16): uint16 {.magic: "SubU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `-`(x, y: uint32): uint32 {.magic: "SubU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `-`(x, y: uint64): uint64 {.magic: "SubU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `-`(x: float): float {.magic: "UnaryMinusF64", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `-`(x: float32): float32 {.magic: "UnaryMinusF64", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `-`(x: int): int {.magic: "UnaryMinusI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Унарный
-оператор для целого числа. Инвертируетx. Исходный код Редактировать proc `-`(x: int8): int8 {.magic: "UnaryMinusI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `-`(x: int16): int16 {.magic: "UnaryMinusI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `-`(x: int32): int32 {.magic: "UnaryMinusI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `-`(x: int64): int64 {.magic: "UnaryMinusI64", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
func `-`[T](x, y: set[T]): set[T] {.magic: "MinusSet", ...raises: [], tags: [], forbids: [].}- Этот оператор вычисляет разность двух множеств.
Пример:
assert {1, 2, 3} - {2, 3, 4} == {1}Исходный код Редактировать proc `-%`(x, y: int): int {.inline, ...raises: [], tags: [], forbids: [].}-
Рассматривает
xиyкак беззнаковые и вычитает их.Результат усекается для соответствия результату. Это реализует модульную арифметику. Ошибки переполнения невозможны.
Исходный код Редактировать proc `-%`(x, y: int8): int8 {.inline, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `-%`(x, y: int16): int16 {.inline, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `-%`(x, y: int32): int32 {.inline, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `-%`(x, y: int64): int64 {.inline, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `-=`[T: float | float32 | float64](x: var T; y: T) {.inline, noSideEffect.}- Уменьшает значение числа с плавающей точкой на месте. Исходный код Редактировать
proc `-=`[T: SomeInteger](x: var T; y: T) {.magic: "Dec", noSideEffect, ...raises: [], tags: [], forbids: [].}- Уменьшает целое число. Исходный код Редактировать
proc `..`[T, U](a: sink T; b: sink U): HSlice[T, U] {.noSideEffect, inline, magic: "DotDot", ...raises: [], tags: [], forbids: [].}-
Бинарный оператор slice, который создаёт интервал
[a, b], при этомaиbвключительно.Слайсы также могут использоваться в конструкторе множеств и в операторах выбора по порядковому номеру, но тогда они обрабатываются компилятором как специальные случаи.
let a = [10, 20, 30, 40, 50] echo a[2 .. 3] # @[30, 40]
Исходный код Редактировать proc `..`[T](b: sink T): HSlice[int, T] {.noSideEffect, inline, magic: "DotDot", ...deprecated: "replace `..b` with `0..b`", raises: [], tags: [], forbids: [].}-
Унарный оператор slice, который создаёт интервал
[default(int), b].let a = [10, 20, 30, 40, 50] echo a[.. 2] # @[10, 20, 30]
Исходный код Редактировать proc `/`(x, y: float): float {.magic: "DivF64", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `/`(x, y: float32): float32 {.magic: "DivF64", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `/`(x, y: int): float {.inline, noSideEffect, ...raises: [], tags: [], forbids: [].}-
Деление целых чисел с результатом с плавающей точкой.
echo 7 / 5 # => 1.4
См. также:
Исходный код Редактировать
proc `/%`(x, y: int): int {.inline, ...raises: [], tags: [], forbids: [].}-
Обрабатывает
xиyкак беззнаковые и делит их.Результат усекается для соответствия результату. Это реализует арифметику по модулю. Ошибки переполнения невозможны.
Исходный код Изменить proc `/%`(x, y: int8): int8 {.inline, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `/%`(x, y: int16): int16 {.inline, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `/%`(x, y: int32): int32 {.inline, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `/%`(x, y: int64): int64 {.inline, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `/=`(x: var float64; y: float64) {.inline, noSideEffect, ...raises: [], tags: [], forbids: [].}- Делит число с плавающей точкой на месте. Исходный код Изменить
proc `/=`[T: float | float32](x: var T; y: T) {.inline, noSideEffect.}- Делит число с плавающей точкой на месте. Исходный код Изменить
proc `<`(x, y: bool): bool {.magic: "LtB", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<`(x, y: char): bool {.magic: "LtCh", noSideEffect, ...raises: [], tags: [], forbids: [].}- Сравнивает два символа и возвращает true, если
xстоит лексикографически передy(заглавные буквы стоят перед строчными).Пример:
let a = 'a' b = 'b' c = 'Z' assert a < b assert not (a < a) assert not (a < c)
Исходный код Изменить proc `<`(x, y: float): bool {.magic: "LtF64", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<`(x, y: float32): bool {.magic: "LtF64", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<`(x, y: int): bool {.magic: "LtI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Возвращает true, если
xменьшеy. Исходный код Изменить proc `<`(x, y: int8): bool {.magic: "LtI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<`(x, y: int16): bool {.magic: "LtI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<`(x, y: int32): bool {.magic: "LtI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<`(x, y: int64): bool {.magic: "LtI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<`(x, y: pointer): bool {.magic: "LtPtr", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<`(x, y: string): bool {.magic: "LtStr", noSideEffect, ...raises: [], tags: [], forbids: [].}- Сравнивает две строки и возвращает true, если
xстоит лексикографически передy(заглавные буквы стоят перед строчными).Пример:
let a = "abc" b = "abd" c = "ZZZ" assert a < b assert not (a < a) assert not (a < c)
Исходный код Изменить proc `<`(x, y: uint): bool {.magic: "LtU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Возвращает true, если
x < y. Исходный код Изменить proc `<`(x, y: uint8): bool {.magic: "LtU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<`(x, y: uint16): bool {.magic: "LtU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<`(x, y: uint32): bool {.magic: "LtU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<`(x, y: uint64): bool {.magic: "LtU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<`[Enum: enum](x, y: Enum): bool {.magic: "LtEnum", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<`[T: tuple](x, y: T): bool
- Общий лексикографический
<оператор для кортежей, который поднимается из компонентовxиy. Эта реализация используетcmp. Исходный код Изменить proc `<`[T](x, y: ptr T): bool {.magic: "LtPtr", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<`[T](x, y: ref T): bool {.magic: "LtPtr", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<`[T](x, y: set[T]): bool {.magic: "LtSet", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Возвращает true, если
xявляется строгим или надлежащим подмножествомy.Строгое или надлежащее подмножество
xсодержит все свои элементы вy, ноyимеет больше элементов, чемy.Пример:
let a = {3, 5} b = {1, 3, 5, 7} c = {2} assert a < b assert not (a < a) assert not (a < c)Исходный код Изменить
proc `<%`(x, y: int): bool {.inline, ...raises: [], tags: [], forbids: [].}- Обрабатывает
xиyкак беззнаковые и сравнивает их. Возвращает true, еслиunsigned(x) < unsigned(y). Исходный код Изменить proc `<%`(x, y: int8): bool {.inline, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<%`(x, y: int16): bool {.inline, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<%`(x, y: int32): bool {.inline, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<%`(x, y: int64): bool {.inline, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<=`(x, y: bool): bool {.magic: "LeB", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<=`(x, y: char): bool {.magic: "LeCh", noSideEffect, ...raises: [], tags: [], forbids: [].}- Сравнивает два символа и возвращает true, если
xлексикографически предшествуетy(заглавные буквы предшествуют строчным).Пример:
let a = 'a' b = 'b' c = 'Z' assert a <= b assert a <= a assert not (a <= c)
Исходный код Изменить proc `<=`(x, y: float): bool {.magic: "LeF64", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<=`(x, y: float32): bool {.magic: "LeF64", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<=`(x, y: int): bool {.magic: "LeI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Возвращает true, если
xменьше или равноy. Исходный код Изменить proc `<=`(x, y: int8): bool {.magic: "LeI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<=`(x, y: int16): bool {.magic: "LeI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<=`(x, y: int32): bool {.magic: "LeI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<=`(x, y: int64): bool {.magic: "LeI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<=`(x, y: pointer): bool {.magic: "LePtr", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<=`(x, y: string): bool {.magic: "LeStr", noSideEffect, ...raises: [], tags: [], forbids: [].}- Сравнивает две строки и возвращает true, если
xлексикографически предшествуетy(заглавные буквы предшествуют строчным).Пример:
let a = "abc" b = "abd" c = "ZZZ" assert a <= b assert a <= a assert not (a <= c)
Исходный код Изменить proc `<=`(x, y: uint): bool {.magic: "LeU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Возвращает true, если
x <= y. Исходный код Изменить proc `<=`(x, y: uint8): bool {.magic: "LeU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<=`(x, y: uint16): bool {.magic: "LeU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<=`(x, y: uint32): bool {.magic: "LeU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<=`(x, y: uint64): bool {.magic: "LeU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<=`[Enum: enum](x, y: Enum): bool {.magic: "LeEnum", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<=`[T: tuple](x, y: T): bool
- Универсальный лексикографический оператор сравнения для кортежей, полученный из компонентов
xиy. Эта реализация используетcmp. Исходный код Изменить proc `<=`[T](x, y: ref T): bool {.magic: "LePtr", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<=`[T](x, y: set[T]): bool {.magic: "LeSet", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Возвращает true, если
xявляется подмножествомy.Подмножество
xсодержит все свои члены вy, иyне обязательно имеет больше членов, чемx. То естьxможет быть равноy.Пример:
let a = {3, 5} b = {1, 3, 5, 7} c = {2} assert a <= b assert a <= a assert not (a <= c)Исходный код Изменить proc `<=%`(x, y: int): bool {.inline, ...raises: [], tags: [], forbids: [].}- Обрабатывает
xиyкак беззнаковые и сравнивает их. Возвращает true, еслиunsigned(x) <= unsigned(y). Исходный код Изменить proc `<=%`(x, y: int8): bool {.inline, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<=%`(x, y: int16): bool {.inline, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<=%`(x, y: int32): bool {.inline, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `<=%`(x, y: int64): bool {.inline, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `=`[T](dest: var T; src: T) {.noSideEffect, magic: "Asgn", ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `==`(x, y: bool): bool {.magic: "EqB", noSideEffect, ...raises: [], tags: [], forbids: [].}- Проверяет равенство двух переменных типа
bool. Исходный код Изменить proc `==`(x, y: char): bool {.magic: "EqCh", noSideEffect, ...raises: [], tags: [], forbids: [].}- Проверяет равенство двух переменных типа
char. Исходный код Изменить proc `==`(x, y: cstring): bool {.magic: "EqCString", noSideEffect, inline, ...raises: [], tags: [], forbids: [].}- Проверяет равенство двух переменных типа
cstring. Исходный код Изменить proc `==`(x, y: float): bool {.magic: "EqF64", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `==`(x, y: float32): bool {.magic: "EqF64", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `==`(x, y: int): bool {.magic: "EqI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Сравнивает два целых числа на равенство. Исходный код Изменить
proc `==`(x, y: int8): bool {.magic: "EqI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `==`(x, y: int16): bool {.magic: "EqI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `==`(x, y: int32): bool {.magic: "EqI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `==`(x, y: int64): bool {.magic: "EqI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `==`(x, y: pointer): bool {.magic: "EqRef", noSideEffect, ...raises: [], tags: [], forbids: [].}- Проверяет равенство двух переменных типа
pointer.Пример:
var # this is a wildly dangerous example a = cast[pointer](0) b = cast[pointer](nil) assert a == b # true due to the special meaning of `nil`/0 as a pointer
Исходный код Изменить proc `==`(x, y: string): bool {.magic: "EqStr", noSideEffect, ...raises: [], tags: [], forbids: [].}- Проверяет равенство двух переменных типа
string. Исходный код Изменить proc `==`(x, y: uint): bool {.magic: "EqI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Сравнивает два беззнаковых целых числа на равенство. Исходный код Изменить
proc `==`(x, y: uint8): bool {.magic: "EqI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `==`(x, y: uint16): bool {.magic: "EqI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `==`(x, y: uint32): bool {.magic: "EqI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `==`(x, y: uint64): bool {.magic: "EqI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `==`[Enum: enum](x, y: Enum): bool {.magic: "EqEnum", noSideEffect, ...raises: [], tags: [], forbids: [].}- Проверяет, имеют ли значения в одном и том же перечислении одинаковое значение в основе.
Пример:
type Enum1 = enum field1 = 3, field2 Enum2 = enum place1, place2 = 3 var e1 = field1 e2 = place2.ord.Enum1 assert e1 == e2 assert not compiles(e1 == place2) # raises errorИсходный код Изменить proc `==`[I, T](x, y: array[I, T]): bool
- Исходный код Изменить
proc `==`[T: proc | iterator](x, y: T): bool {.magic: "EqProc", noSideEffect, ...raises: [], tags: [], forbids: [].}- Проверяет, ссылаются ли две переменные
procна одну и ту же процедуру. Исходный код Изменить proc `==`[T: tuple | object](x, y: T): bool
- Общий оператор
==для кортежей, который поднимается из компонентовxиy. Исходный код Изменить proc `==`[T](x, y: openArray[T]): bool
- Исходный код Изменить
proc `==`[T](x, y: ptr T): bool {.magic: "EqRef", noSideEffect, ...raises: [], tags: [], forbids: [].}- Проверяет, ссылаются ли две переменные
ptrна один и тот же элемент. Исходный код Изменить proc `==`[T](x, y: ref T): bool {.magic: "EqRef", noSideEffect, ...raises: [], tags: [], forbids: [].}- Проверяет, ссылаются ли две переменные
refна один и тот же элемент. Исходный код Изменить proc `==`[T](x, y: seq[T]): bool {.noSideEffect.}- Общий оператор равенства для последовательностей: опирается на оператор равенства для типа элемента
T. Исходный код Изменить proc `==`[T](x, y: set[T]): bool {.magic: "EqSet", noSideEffect, ...raises: [], tags: [], forbids: [].}- Проверяет равенство двух переменных типа
set.Пример:
assert {1, 2, 2, 3} == {1, 2, 3} # duplication in sets is ignoredИсходный код Изменить proc `=copy`[T](dest: var T; src: T) {.noSideEffect, magic: "Asgn", ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `=destroy`(x: string) {.inline, magic: "Destroy", enforceNoRaises, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `=destroy`[T](x: ref T) {.inline, magic: "Destroy", ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `=destroy`[T](x: seq[T]) {.inline, magic: "Destroy", ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `=destroy`[T](x: var T) {.inline, magic: "Destroy", ...raises: [], tags: [], forbids: [].}- Реализация универсального деструктора, которую можно переопределить. Исходный код Изменить
proc `=dup`[T](x: T): T {.inline, magic: "Dup", ...raises: [], tags: [], forbids: [].}- Реализация универсального dup, которую можно переопределить. Исходный код Изменить
proc `=sink`[T](x: var T; y: T) {.inline, nodestroy, magic: "Asgn", ...raises: [], tags: [], forbids: [].}- Реализация универсального sink, которую можно переопределить. Исходный код Изменить
proc `=trace`[T](x: var T; env: pointer) {.inline, magic: "Trace", ...raises: [], tags: [], forbids: [].}- Общее отслеживание реализация, которую можно переопределить. Исходный код Редактировать
proc `=wasMoved`[T](obj: var T) {.magic: "WasMoved", noSideEffect, ...raises: [], tags: [], forbids: [].}- Общая реализация wasMoved, которую можно переопределить. Исходный код Редактировать
proc `@`[IDX, T](a: sink array[IDX, T]): seq[T] {.magic: "ArrToSeq", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Преобразует массив в последовательность.
Это чаще всего используется для создания последовательностей с конструктором массива:
@[1, 2, 3]имеет типseq[int], в то время как[1, 2, 3]имеет типarray[0..2, int].let a = [1, 3, 5] b = "foo" echo @a # => @[1, 3, 5] echo @b # => @['f', 'o', 'o']
Исходный код Редактировать proc `@`[T](a: openArray[T]): seq[T] {.magic: "OpenArrayToSeq", ...raises: [], tags: [], forbids: [].}-
Преобразует openArray в последовательность.
Это не так эффективно, как преобразование массива фиксированной длины в последовательность, так как он всегда копирует каждый элемент
Исходный код Редактироватьa. proc `[]`(s: string; i: BackwardsIndex): char {.inline, systemRaisesDefect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `[]`(s: var string; i: BackwardsIndex): var char {.inline, systemRaisesDefect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `[]`[I: Ordinal; T](a: T; i: I): T {.noSideEffect, magic: "ArrGet", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `[]`[Idx, T; U, V: Ordinal](a: array[Idx, T]; x: HSlice[U, V]): seq[T] {. systemRaisesDefect.}-
Операция среза для массивов. Возвращает диапазон
[a[x.a], a[x.b]].var a = [1, 2, 3, 4] assert a[0..2] == @[1, 2, 3]
См. также:
Исходный код Редактировать proc `[]`[Idx, T](a: array[Idx, T]; i: BackwardsIndex): T {.inline, systemRaisesDefect.}- Исходный код Редактировать
proc `[]`[Idx, T](a: var array[Idx, T]; i: BackwardsIndex): var T {.inline, systemRaisesDefect.}- Исходный код Редактировать
proc `[]`[T, U: Ordinal](s: string; x: HSlice[T, U]): string {.inline, systemRaisesDefect.}-
Операция среза для строк. Возвращает диапазон
[s[x.a], s[x.b]].var s = "abcdef" assert s[1..3] == "bcd"
Исходный код Редактировать proc `[]`[T; U, V: Ordinal](s: openArray[T]; x: HSlice[U, V]): seq[T] {. systemRaisesDefect.}-
Операция среза для последовательностей. Возвращает диапазон
[s[x.a], s[x.b]].var s = @[1, 2, 3, 4] assert s[0..2] == @[1, 2, 3]
См. также:
Исходный код Редактировать proc `[]`[T](s: openArray[T]; i: BackwardsIndex): T {.inline, systemRaisesDefect.}- Исходный код Редактировать
proc `[]`[T](s: var openArray[T]; i: BackwardsIndex): var T {.inline, systemRaisesDefect.}- Исходный код Редактировать
proc `[]=`(s: var string; i: BackwardsIndex; x: char) {.inline, systemRaisesDefect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `[]=`[I: Ordinal; T, S](a: T; i: I; x: sink S) {.noSideEffect, magic: "ArrPut", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `[]=`[Idx, T; U, V: Ordinal](a: var array[Idx, T]; x: HSlice[U, V]; b: openArray[T]) {.systemRaisesDefect.}-
Присвоение среза для массивов.
var a = [10, 20, 30, 40, 50] a[1..2] = @[99, 88] assert a == [10, 99, 88, 40, 50]
Исходный код Редактировать proc `[]=`[Idx, T](a: var array[Idx, T]; i: BackwardsIndex; x: T) {.inline, systemRaisesDefect.}- Исходный код Редактировать
proc `[]=`[T, U: Ordinal](s: var string; x: HSlice[T, U]; b: string) {. systemRaisesDefect.}-
Присвоение среза для строк.
Если
b.lenне равно количеству элементов, на которые ссылаетсяx, выполняется вставка:Пример:
var s = "abcdefgh" s[1 .. ^2] = "xyz" assert s == "axyzh"
Исходный код Редактировать proc `[]=`[T; U, V: Ordinal](s: var seq[T]; x: HSlice[U, V]; b: openArray[T]) {. systemRaisesDefect.}-
Присвоение среза для последовательностей.
Если
b.lenне равно количеству элементов, на которые ссылаетсяx, выполняется вставка.Пример:
var s = @"abcdefgh" s[1 .. ^2] = @"xyz" assert s == @"axyzh"
Исходный код Редактировать proc `[]=`[T](s: var openArray[T]; i: BackwardsIndex; x: T) {.inline, systemRaisesDefect.}- Исходный код Редактировать
func abs(x: int): int {.magic: "AbsI", inline, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
func abs(x: int8): int8 {.magic: "AbsI", inline, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
func abs(x: int16): int16 {.magic: "AbsI", inline, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
func abs(x: int32): int32 {.magic: "AbsI", inline, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
func abs(x: int64): int64 {.magic: "AbsI", inline, ...raises: [], tags: [], forbids: [].}-
Возвращает абсолютное значение
x.Если
Исходный код Редактироватьxравноlow(x)(то есть -MININT для его типа), возникает исключение переполнения (если проверка переполнения включена). proc abs[T: float64 | float32](x: T): T {.noSideEffect, inline.}- Исходный код Редактировать
proc add(x: var cstring; y: cstring) {.magic: "AppendStrStr", ...raises: [], tags: [], forbids: [].}- Добавляет
yкxна месте. Реализовано только для JS бэкэнда.Пример:
when defined(js): var tmp: cstring = "" tmp.add(cstring("ab")) tmp.add(cstring("cd")) doAssert tmp == cstring("abcd")Исходный код Изменить proc add(x: var string; y: char) {.magic: "AppendStrCh", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Добавляет
yкxна месте.var tmp = "" tmp.add('a') tmp.add('b') assert(tmp == "ab")Исходный код Изменить proc add(x: var string; y: cstring) {.asmNoStackFrame, ...raises: [], tags: [], forbids: [].}- Добавляет
yкxна месте.Пример:
var tmp = "" tmp.add(cstring("ab")) tmp.add(cstring("cd")) doAssert tmp == "abcd"Исходный код Изменить proc add(x: var string; y: string) {.magic: "AppendStrStr", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Конкатенирует
xиyна месте.См. также
strbasics.add.Пример:
var tmp = "" tmp.add("ab") tmp.add("cd") assert tmp == "abcd"Исходный код Изменить proc add[T](x: var seq[T]; y: openArray[T]) {.noSideEffect.}-
Обобщённая процедура для добавления контейнера
yв контейнерx.Для контейнеров с порядком
addозначает добавление в конец. Новые обобщённые контейнеры также должны вызывать свою процедуру добавленияaddдля согласованности. Обобщённый код становится значительно проще для написания, если соблюдается схема именования Nim.См. также:
Пример:
var a = @["a1", "a2"] a.add(["b1", "b2"]) assert a == @["a1", "a2", "b1", "b2"] var c = @["c0", "c1", "c2", "c3"] a.add(c.toOpenArray(1, 2)) assert a == @["a1", "a2", "b1", "b2", "c1", "c2"]
Исходный код Изменить proc add[T](x: var seq[T]; y: sink T) {.magic: "AppendSeqElem", noSideEffect, nodestroy, ...raises: [], tags: [], forbids: [].}-
Обобщённая процедура для добавления элемента данных
yв контейнерx.Для контейнеров с порядком
Исходный код Изменитьaddозначает добавление в конец. Новые обобщённые контейнеры также должны вызывать свою процедуру добавленияaddдля согласованности. Обобщённый код становится значительно проще для написания, если соблюдается схема именования Nim. proc addEscapedChar(s: var string; c: char) {.noSideEffect, inline, ...raises: [], tags: [], forbids: [].}- Добавляет символ к строке
sи применяет следующие экранирования:- заменяет любой
\на\\ - заменяет любой
'на\' - заменяет любой
"на\" - заменяет любой
\aна\\a - заменяет любой
\bна\\b - заменяет любой
\tна\\t - заменяет любой
\nна\\n - заменяет любой
\vна\\v - заменяет любой
\fна\\f - заменяет любой
\rна\\r - заменяет любой
\eна\\e - заменяет любой другой символ, не входящий в набор
{\21..\126}на\xHHгдеHH- его шестнадцатеричное значение
Процедура разработана таким образом, чтобы её вывод был пригоден для многих различных распространённых синтаксисов.
Предупреждение: Это неверно для генерации кода ANSI C!Исходный код Изменить - заменяет любой
proc addQuitProc(quitProc: proc () {.noconv.}) {.importc: "atexit", header: "<stdlib.h>", ...deprecated: "use exitprocs.addExitProc", raises: [], tags: [], forbids: [].}-
Добавляет/регистрирует процедуру завершения.
Каждый вызов
Исходный код ИзменитьaddQuitProcрегистрирует ещё одну процедуру завершения. Может быть зарегистрировано до 30 процедур. Они выполняются по принципу LIFO (последняя зарегистрированная функция выполняется первой).addQuitProcвыводит исключение EOutOfIndex, еслиquitProcне может быть зарегистрировано. proc addQuoted[T](s: var string; x: T)
-
Добавляет
xк строкеsна месте, применяя цитирование и экранирование, еслиxявляется строкой или символом.См. addEscapedChar для схемы экранирования. Когда
xявляется строкой, символы в диапазоне{\128..\255}никогда не экранируются, чтобы многобайтовые символы UTF-8 оставались без изменений (обратите внимание, что это поведение отличается отaddEscapedChar).Стандартная библиотека Nim использует эту функцию для элементов коллекций при создании строкового представления коллекции. Рекомендуется использовать эту функцию и для коллекций со стороны пользователя. Пользователи могут перегрузить
addQuotedдля пользовательских (строкоподобных) типов, если они хотят реализовать настраиваемое представление элемента.var tmp = "" tmp.addQuoted(1) tmp.add(", ") tmp.addQuoted("string") tmp.add(", ") tmp.addQuoted('c') assert(tmp == """1, "string", 'c'""")Исходный код Изменить proc `addr`[T](x: T): ptr T {.magic: "Addr", noSideEffect, ...raises: [], tags: [], forbids: [].}- Встроенный оператор
addrдля получения адреса области памяти.Примечание: Это работает дляletпеременных или параметров для лучшей совместимости с C. При использовании для написания обёртки для библиотеки C и получения адресаletпеременных или параметров, всегда необходимо проверять, что исходная библиотека никогда не записывает в данные за указателем, возвращаемым этой процедурой.Не может быть перегружена.
var buf: seq[char] = @['a','b','c'] p = buf[1].addr echo p.repr # ref 0x7faa35c40059 --> 'b' echo p[] # b
Исходный код Изменить proc alignof(x: typedesc): int {.magic: "AlignOf", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc alignof[T](x: T): int {.magic: "AlignOf", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc alloc0Impl(size: Natural): pointer {.noconv, ...gcsafe, tags: [], gcsafe, raises: [], forbids: [].}- Исходный код Изменить
proc allocCStringArray(a: openArray[string]): cstringArray {....raises: [], tags: [], forbids: [].}- Создаёт массив cstring, завершаемый нулём, из
a. Результат необходимо освободить с помощьюdeallocCStringArrayпосле того, как он больше не нужен. Исходный код Изменить proc allocImpl(size: Natural): pointer {.noconv, ...gcsafe, tags: [], gcsafe, raises: [], forbids: [].}- Исходный код Изменить
proc `and`(a, b: typedesc): typedesc {.magic: "TypeTrait", noSideEffect, ...raises: [], tags: [], forbids: [].}- Создаёт метакласс
and. Исходный код Изменить proc `and`(x, y: bool): bool {.magic: "And", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Булево
and; возвращает true, еслиx == y == true(если оба аргумента true).Вычисление ленивое: если
Исходный код Изменитьxложно, тоyдаже не будет вычислено. proc `and`(x, y: int): int {.magic: "BitandI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Вычисляет
bitwise andчиселxиy.Пример:
assert (0b0011 and 0b0101) == 0b0001 assert (0b0111 and 0b1100) == 0b0100
Исходный код Изменить proc `and`(x, y: int8): int8 {.magic: "BitandI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `and`(x, y: int16): int16 {.magic: "BitandI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `and`(x, y: int32): int32 {.magic: "BitandI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `and`(x, y: int64): int64 {.magic: "BitandI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `and`(x, y: uint): uint {.magic: "BitandI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Вычисляет
bitwise andчиселxиy. Исходный код Изменить proc `and`(x, y: uint8): uint8 {.magic: "BitandI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `and`(x, y: uint16): uint16 {.magic: "BitandI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `and`(x, y: uint32): uint32 {.magic: "BitandI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `and`(x, y: uint64): uint64 {.magic: "BitandI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc arrayWith[T](y: T; size: static int): array[size, T] {....raises: [].}- Создаёт новый массив, заполненный
y. Исходный код Изменить proc ashr(x: int8; y: SomeInteger): int8 {.magic: "AshrI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc ashr(x: int16; y: SomeInteger): int16 {.magic: "AshrI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc ashr(x: int32; y: SomeInteger): int32 {.magic: "AshrI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc ashr(x: int64; y: SomeInteger): int64 {.magic: "AshrI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc ashr(x: int; y: SomeInteger): int {.magic: "AshrI", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Сдвигает вправо, заполняя освободившиеся биты копией самого левого бита слева, а правые биты отбрасывает.
Обратите внимание, что
ashrне является оператором, поэтому используйте обычный синтаксис вызова функции.См. также:
Пример:
assert ashr(0b0001_0000'i8, 2) == 0b0000_0100'i8 assert ashr(0b1000_0000'i8, 8) == 0b1111_1111'i8 assert ashr(0b1000_0000'i8, 1) == 0b1100_0000'i8
Исходный код Изменить proc astToStr[T](x: T): string {.magic: "AstToStr", noSideEffect, ...raises: [], tags: [], forbids: [].}- Преобразует абстрактное синтаксическое дерево (AST)
xв строковое представление. Это очень полезно для отладки. Исходный код Изменить func capacity(self: string): int {.inline, ...raises: [], tags: [], forbids: [].}- Возвращает текущую ёмкость строки.
Пример:
var str = newStringOfCap(cap = 42) str.add "Nim" assert str.capacity == 42
Исходный код Изменить func capacity[T](self: seq[T]): int {.inline.}- Возвращает текущую ёмкость последовательности.
Пример:
var lst = newSeqOfCap[string](cap = 42) lst.add "Nim" assert lst.capacity == 42
Исходный код Изменить func card[T](x: set[T]): int {.magic: "Card", ...raises: [], tags: [], forbids: [].}- Возвращает мощность множества
x, то есть количество элементов в множестве.Пример:
var a = {1, 3, 5, 7} assert card(a) == 4 var b = {1, 3, 5, 7, 5} assert card(b) == 4 # repeated 5 doesn't countИсходный код Изменить func chr(u: range[0 .. 255]): char {.magic: "Chr", ...raises: [], tags: [], forbids: [].}- Преобразует
uвchar, то же самое, чтоchar(u).Пример:
doAssert chr(65) == 'A' doAssert chr(255) == '\255' doAssert chr(255) == char(255) doAssert not compiles chr(256) doAssert not compiles char(256) var x = 256 doAssertRaises(RangeDefect): discard chr(x) doAssertRaises(RangeDefect): discard char(x)
Исходный код Изменить proc clamp[T](x, a, b: T): T
- Ограничивает значение
xв интервале [a, b]. Эта функция эквивалентна, но быстрее, чемmax(a, min(b, x)).Предупреждение:a <= bпредполагается и не будет проверяться (на данный момент).См. также:
math.clampдля версии, принимающейSlice[T]вместо.Пример:
assert (1.4).clamp(0.0, 1.0) == 1.0 assert (0.5).clamp(0.0, 1.0) == 0.5 assert 4.clamp(1, 3) == max(1, min(3, 4))
Исходный код Изменить proc close[TMsg](c: var Channel[TMsg])
- Закрывает канал
cи освобождает связанные ресурсы. Исходный код Изменить proc cmp(x, y: string): int {.noSideEffect, ...raises: [], tags: [], forbids: [].}-
Функция сравнения для строк. Более эффективна, чем общая версия.
Примечание: точные значения результатов зависят от используемой библиотеки C-времени выполнения и могут отличаться между операционными системами!
Исходный код Изменить proc cmp[T](x, y: T): int
-
Общая функция сравнения.
Возвращает:
- значение меньше нуля, если
x < y - значение больше нуля, если
x > y - ноль, если
x == y
Это полезно для написания общих алгоритмов без потери производительности. Эта общая реализация использует операторы
==и<.import std/algorithm echo sorted(@[4, 2, 6, 5, 8, 7], cmp[int])
Исходный код Изменить - значение меньше нуля, если
proc cmpMem(a, b: pointer; size: Natural): int {.inline, noSideEffect, ...tags: [], raises: [], forbids: [].}-
Сравнивает блоки памяти
aиb. Будет сравненоsizeбайтов.Возвращает:
- значение меньше нуля, если
a < b - значение больше нуля, если
a > b - ноль, если
a == b
Как любая процедура, работающая с сырой памятью, это небезопасно.
Исходный код Изменить - значение меньше нуля, если
proc compileOption(option, arg: string): bool {.magic: "CompileOptionArg", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Может быть использована для определения компиляционной опции перечисления.
См. также:
-
compileOption для опций
on|off - defined
- модуль std/compilesettings
Пример:
when compileOption("opt", "size") and compileOption("gc", "boehm"): discard "compiled with optimization for size and uses Boehm's GC"Исходный код Изменить -
compileOption для опций
proc compileOption(option: string): bool {.magic: "CompileOption", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Может быть использована для определения
on|offкомпиляционной опции.См. также:
- compileOption для опций перечислений
- defined
- модуль std/compilesettings
Пример: cmd: --floatChecks:off
static: doAssert not compileOption("floatchecks") {.push floatChecks: on.} static: doAssert compileOption("floatchecks") # floating point NaN and Inf checks enabled in this scope {.pop.}Исходный код Изменить proc compiles(x: untyped): bool {.magic: "Compiles", noSideEffect, compileTime, ...raises: [], tags: [], forbids: [].}-
Специальная процедура компиляции, которая проверяет, может ли
xбыть скомпилирована без каких-либо семантических ошибок. Это можно использовать для проверки, поддерживает ли тип какую-либо операцию:when compiles(3 + 4): echo "'+' for integers is available"
Исходный код Изменить proc contains[T](a: openArray[T]; item: T): bool {.inline.}-
Возвращает true, если
itemсодержится вa, или false, если не найдено. Это сокращение дляfind(a, item) >= 0.Это позволяет использовать оператор
in:a.contains(item)эквивалентноitem in a.var a = @[1, 3, 5] assert a.contains(5) assert 3 in a assert 99 notin a
Исходный код Изменить func contains[T](x: set[T]; y: T): bool {.magic: "InSet", ...raises: [], tags: [], forbids: [].}-
Необходимо перегрузить эту процедуру, если необходимо перегрузить оператор
in.Параметры расположены в обратном порядке!
a in bявляется шаблоном дляcontains(b, a). Это связано с тем, что алгоритм унификации, используемый Nim для разрешения перегрузки, работает слева направо. Но для оператораinэтот порядок был бы неверным для этого фрагмента кода:Пример:
var s: set[range['a'..'z']] = {'a'..'c'} assert s.contains('c') assert 'b' in s assert 'd' notin s assert set['a'..'z'] is set[range['a'..'z']]Еслиinбыл объявлен как[T](elem: T, s: set[T]), тоTбыл бы привязан кchar. Ноsнесовместим с типомset[char]! Решением является привязкаTкrange['a'..'z']. Это достигается изменением порядка параметров дляcontains;inзатем передает свои аргументы в обратном порядке. Исходный код Изменить proc contains[U, V, W](s: HSlice[U, V]; value: W): bool {.noSideEffect, inline.}-
Проверяет, находится ли
valueв диапазонеs; возвращает true, еслиvalue >= s.a and value <= s.b.assert((1..3).contains(1) == true) assert((1..3).contains(2) == true) assert((1..3).contains(4) == false)
Исходный код Изменить proc copyMem(dest, source: pointer; size: Natural) {.inline, ...gcsafe, tags: [], raises: [], forbids: [].}- Копирует содержимое из памяти по адресу
sourceв память по адресуdest. Будет скопировано ровноsizeбайтов. Области памяти не должны перекрываться. Как любая процедура, работающая с сырой памятью, это небезопасно. Исходный код Изменить proc create(T: typedesc; size = 1.Positive): ptr T:type {.inline, ...gcsafe, raises: [].}-
Выделяет новый блок памяти с размером не менее
T.sizeof * sizeбайтов.Блок необходимо освободить с помощью resize(block, 0) или dealloc(block). Блок инициализируется нулями, поэтому он несколько безопаснее, чем createU.
Выделенная память принадлежит потоку, который её выделил! Используйте createShared для выделения из общей кучи.
Исходный код Изменить proc createU(T: typedesc; size = 1.Positive): ptr T:type {.inline, ...gcsafe, raises: [].}-
Выделяет новый блок памяти с размером не менее
T.sizeof * sizeбайтов.Блок необходимо освободить с помощью resize(block, 0) или dealloc(block). Блок не инициализирован, поэтому чтение из него до записи в него — неопределённое поведение!
Выделенная память принадлежит потоку, который её выделил! Используйте createSharedU для выделения из общей кучи.
См. также:
Исходный код Изменить proc cstringArrayToSeq(a: cstringArray): seq[string] {....raises: [], tags: [], forbids: [].}- Преобразует
cstringArrayвseq[string].aдолжен быть завершёнnil. Исходный код Изменить proc cstringArrayToSeq(a: cstringArray; len: Natural): seq[string] {....raises: [], tags: [], forbids: [].}- Преобразует
cstringArrayвseq[string].aдолжен иметь длинуlen. Исходный код Изменить proc dealloc(p: pointer) {.noconv, compilerproc, ...gcsafe, gcsafe, raises: [], tags: [], forbids: [].}-
Освобождает память, выделенную с помощью
alloc,alloc0,realloc,createилиcreateU.Эта процедура опасна! Если вы забудете освободить память, произойдёт утечка; если вы попытаетесь получить доступ к освобождённой памяти (или освободить её дважды!) может произойти сбой ядра или быть повреждена другая память.
Освобождаемая память должна принадлежать потоку, который её выделил! Используйте deallocShared для освобождения из общей кучи.
Исходный код Изменить proc deallocCStringArray(a: cstringArray) {....raises: [], tags: [], forbids: [].}- Освобождает массив cstring, завершённый нулём. Исходный код Изменить
proc deallocImpl(p: pointer) {.noconv, ...gcsafe, tags: [], gcsafe, raises: [], forbids: [].}- Исходный код Изменить
proc debugEcho(x: varargs[typed, `$`]) {.magic: "Echo", noSideEffect, ...tags: [], raises: [], forbids: [].}- Аналогично echo, но, согласно специальному правилу семантики,
debugEchoимитирует отсутствие побочных эффектов, чтобы его можно было использовать в отладочных процедурах, помеченных как noSideEffect. Исходный код Редактировать proc dec[T, V: Ordinal](x: var T; y: V = 1) {.magic: "Dec", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Уменьшает порядковый
xнаy.Если такого значения не существует, поднимается
OverflowDefectили возникает ошибка времени компиляции. Это краткая запись для:x = pred(x, y).Пример:
var i = 2 dec(i) assert i == 1 dec(i, 3) assert i == -2
Исходный код Редактировать proc declared(x: untyped): bool {.magic: "Declared", noSideEffect, compileTime, ...raises: [], tags: [], forbids: [].}-
Специальная процедура времени компиляции, которая проверяет, объявлено ли
x.xдолжен быть идентификатором или квалифицированным идентификатором.Это можно использовать для проверки, предоставляет ли библиотека определённую функцию или нет:
when not declared(strutils.toUpper): # provide our own toUpper proc here, because strutils is # missing it.
См. также:
Исходный код Редактировать proc declaredInScope(x: untyped): bool {.magic: "DeclaredInScope", noSideEffect, compileTime, ...raises: [], tags: [], forbids: [].}- Специальная процедура времени компиляции, которая проверяет, объявлено ли
xв текущем пространстве имён.xдолжен быть идентификатором. Исходный код Редактировать proc deepCopy[T](x: var T; y: T) {.noSideEffect, magic: "DeepCopy", ...raises: [], tags: [], forbids: [].}-
Выполняет глубокую копию
yи копирует её вx.Это также используется генератором кода для реализации
spawn.Для
Исходный код Редактировать--mm:arcили--mm:orcподдержка deepcopy должна быть включена через--deepcopy:on. proc deepCopy[T](y: T): T
- Обёртка для перегрузки
deepCopy. Исходный код Редактировать proc default[T](_: typedesc[T]): T {.magic: "Default", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Возвращает значение по умолчанию типа
T. В отличие отzeroDefault, учитывает поля по умолчанию объекта.См. также:
Пример: cmd: -d:nimPreviewRangeDefault
assert (int, float).default == (0, 0.0) type Foo = object a: range[2..6] var x = Foo.default assert x.a == 2
Исходный код Редактировать proc defined(x: untyped): bool {.magic: "Defined", noSideEffect, compileTime, ...raises: [], tags: [], forbids: [].}-
Специальная процедура времени компиляции, которая проверяет, определено ли
x.x— это внешний символ, введённый через параметр компилятора -d:x для включения условных операторов на этапе сборки:when not defined(release): # Do here programmer friendly expensive sanity checks. # Put here the normal code
См. также:
-
compileOption для параметров
on|off - compileOption для параметров перечисления
- макросы define
-
compileOption для параметров
proc del[T](x: var seq[T]; i: Natural) {.noSideEffect.}-
Удаляет элемент по индексу
i, помещаяx[high(x)]в позициюi.Это операция
O(1).См. также:
- delete для сохранения порядка
Пример:
var a = @[10, 11, 12, 13, 14] a.del(2) assert a == @[10, 11, 14, 13]
Исходный код Редактировать proc delete[T](x: var seq[T]; i: Natural) {.noSideEffect, systemRaisesDefect.}-
Удаляет элемент по индексу
i, сдвигая всеx[i+1..^1]элементы на одну позицию.Это операция
O(n).См. также:
- del для O(1) операции
Пример:
var s = @[1, 2, 3, 4, 5] s.delete(2) doAssert s == @[1, 2, 4, 5]
Исходный код Редактировать proc dispose(x: ForeignCell) {....raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `div`(x, y: int): int {.magic: "DivI", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Вычисляет целочисленное деление.
Приблизительно то же, что
math.trunc(x/y).int.Пример:
assert (1 div 2) == 0 assert (2 div 2) == 1 assert (3 div 2) == 1 assert (7 div 3) == 2 assert (-7 div 3) == -2 assert (7 div -3) == -2 assert (-7 div -3) == 2
Исходный код Редактировать proc `div`(x, y: int8): int8 {.magic: "DivI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `div`(x, y: int16): int16 {.magic: "DivI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `div`(x, y: int32): int32 {.magic: "DivI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `div`(x, y: int64): int64 {.magic: "DivI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `div`(x, y: uint): uint {.magic: "DivU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Вычисляет целочисленное деление для беззнаковых целых чисел. Это примерно то же, что
trunc(x/y). Исходный код Редактировать proc `div`(x, y: uint8): uint8 {.magic: "DivU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `div`(x, y: uint16): uint16 {.magic: "DivU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `div`(x, y: uint32): uint32 {.magic: "DivU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `div`(x, y: uint64): uint64 {.magic: "DivU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc echo(x: varargs[typed, `$`]) {.magic: "Echo", ...gcsafe, sideEffect, ...raises: [], tags: [], forbids: [].}-
Записывает и сбрасывает параметры в стандартный вывод.
Специальная встроенная функция, принимающая переменное количество аргументов. Каждый аргумент преобразуется в строку с помощью
$, поэтому она работает для пользовательских типов, имеющих перегруженный оператор$. Она примерно эквивалентнаwriteLine(stdout, x); flushFile(stdout), но также доступна для целевой платформы JavaScript.В отличие от других операций ввода/вывода, эта гарантированно потокобезопасна, так как
Исходный код Редактироватьechoочень часто используется для удобства отладки. Если вы хотите использоватьechoвнутри процедуры без побочных эффектов, вы можете использовать debugEcho вместо неё. proc ensureMove[T](x: T): T {.magic: "EnsureMove", noSideEffect, ...raises: [], tags: [], forbids: [].}- Обеспечивает перемещение
xв новое местоположение, в противном случае возникает ошибка во время компиляции.Пример:
proc foo = var x = "Hello" let y = ensureMove(x) doAssert y == "Hello" foo()
Исходный код Редактировать proc equalMem(a, b: pointer; size: Natural): bool {.inline, noSideEffect, ...tags: [], raises: [], forbids: [].}-
Сравнивает блоки памяти
aиb. Будет сравненоsizeбайт.Если блоки равны, возвращается
Исходный код Редактироватьtrue, в противном случаеfalse. Как и любая процедура, работающая с сырой памятью, она является неопасной. func excl[T](x: var set[T]; y: T) {.magic: "Excl", ...raises: [], tags: [], forbids: [].}-
Исключает элемент
yиз набораx.Это то же самое, что и
x = x - {y}, но может быть более эффективным.Пример:
var b = {2, 3, 5, 6, 12, 54} b.excl(5) assert b == {2, 3, 6, 12, 54}Исходный код Редактировать proc find[T, S](a: T; item: S): int {.inline.}- Возвращает первый индекс
itemвaили -1, если не найдено. Для работы требуется соответствующие операцииitemsи==. Исходный код Редактировать proc finished[T: iterator {.closure.}](x: T): bool {.noSideEffect, inline, magic: "Finished", ...raises: [], tags: [], forbids: [].}- Может использоваться для определения завершения итератора первого класса. Исходный код Редактировать
proc GC_disableMarkAndSweep() {....raises: [], tags: [], forbids: [].}- Для
--mm:orcпсевдоним дляGC_disableOrc. Исходный код Редактировать proc GC_disableOrc() {....raises: [], tags: [], forbids: [].}- Отключает подсистему коллектора циклов для
--mm:orc. Это API, специфичное для--mm:orc. Проверьте с помощьюwhen defined(gcOrc)на его существование. Исходный код Редактировать proc GC_enableMarkAndSweep() {....raises: [], tags: [], forbids: [].}- Для
--mm:orcпсевдоним дляGC_enableOrc. Исходный код Редактировать proc GC_enableOrc() {....raises: [], tags: [], forbids: [].}- Включает подсистему коллектора циклов для
--mm:orc. Это API, специфичное для--mm:orc. Проверьте с помощьюwhen defined(gcOrc)на его существование. Исходный код Редактировать proc GC_fullCollect() {....raises: [Exception], tags: [RootEffect], forbids: [].}- Вынуждает выполнение полного прохода сборки мусора. С
--mm:orcзапускается коллектор циклов. Это псевдоним дляGC_runOrc. Исходный код Редактировать proc GC_getStatistics(): string {....raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc GC_partialCollect(limit: int) {....raises: [Exception], tags: [RootEffect], forbids: [].}- Исходный код Редактировать
proc GC_prepareOrc(): int {.inline, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc GC_ref[T](x: ref T)
- Новая среда выполнения поддерживает эту операцию только для 'ref T'. Исходный код Редактировать
proc GC_runOrc() {....raises: [Exception], tags: [RootEffect], forbids: [].}- Вынуждает выполнение прохода сборки циклов. Исходный код Редактировать
proc GC_unref[T](x: ref T)
- Новая среда выполнения поддерживает эту операцию только для 'ref T'. Исходный код Редактировать
proc getAllocStats(): AllocStats {....raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc getCurrentException(): ref Exception {.compilerproc, inline, ...gcsafe, raises: [], tags: [], forbids: [].}- Возвращает текущее исключение; если исключения нет, возвращает
nil. Исходный код Редактировать proc getCurrentExceptionMsg(): string {.inline, ...gcsafe, raises: [], tags: [], forbids: [].}- Возвращает сообщение об ошибке, прикреплённое к текущему исключению; если сообщение отсутствует, возвращает
"". Исходный код Редактировать proc getFrame(): PFrame {.compilerproc, inline, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc getFrameState(): FrameState {.compilerproc, inline, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc getFreeMem(): int {....gcsafe, raises: [], tags: [], forbids: [].}- Возвращает количество байтов, принадлежащих процессу, но не содержащих значимых данных. Исходный код Редактировать
proc getMaxMem(): int {....raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc getOccupiedMem(): int {....gcsafe, raises: [], tags: [], forbids: [].}- Возвращает количество байтов, принадлежащих процессу и содержащих данные. Исходный код Редактировать
proc getStackTrace(): string {....gcsafe, raises: [], tags: [], forbids: [].}- Получает текущий стек вызовов. Работает только в отладочных сборках. Исходный код Редактировать
proc getStackTrace(e: ref Exception): string {....gcsafe, raises: [], tags: [], forbids: [].}- Получает стек вызовов, связанный с
e, который является стеком, приведшим кraiseоператору. Работает только в отладочных сборках. Исходный код Редактировать proc getStackTraceEntries(): seq[StackTraceEntry] {....raises: [], tags: [], forbids: [].}- Возвращает записи стека вызовов для текущего стека вызовов. Пока недоступно для JS-бекенда. Исходный код Редактировать
proc getStackTraceEntries(e: ref Exception): lent seq[StackTraceEntry] {. ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc getThreadId(): int {....raises: [], tags: [], forbids: [].}- Получает идентификатор текущего выполняющегося потока. Исходный код Редактировать
proc getTotalMem(): int {....gcsafe, raises: [], tags: [], forbids: [].}- Возвращает количество байтов, принадлежащих процессу. Исходный код Редактировать
proc getTypeInfo[T](x: T): pointer {.magic: "GetTypeInfo", ...gcsafe, raises: [], tags: [], forbids: [].}-
Получить информацию о типе
x.Обычный код не должен использовать это, а вместо этого использовать модуль typeinfo.
Исходный код Редактировать proc gorge(command: string; input = ""; cache = ""): string {. magic: "StaticExec", ...raises: [], tags: [], forbids: [].}- Это псевдоним для staticExec. Исходный код Редактировать
proc gorgeEx(command: string; input = ""; cache = ""): tuple[output: string, exitCode: int] {....raises: [], tags: [], forbids: [].}- Аналогично gorge, но также возвращает код возврата. Исходный код Редактировать
proc grow[T](x: var seq[T]; newLen: Natural; value: T) {.nodestroy.}- Исходный код Редактировать
proc high(T: typedesc[SomeFloat]): T:type
- Исходный код Редактировать
proc high(x: cstring): int {.magic: "High", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Возвращает максимальный возможный индекс совместимой строки
x. Иногда это операция O(n).См. также:
Исходный код Редактировать proc high(x: string): int {.magic: "High", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Возвращает максимальный возможный индекс строки
x.var str = "Hello world!" high(str) # => 11
См. также:
Исходный код Редактировать proc high[I, T](x: array[I, T]): I {.magic: "High", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Возвращает максимальный возможный индекс массива
x.Для пустых массивов возвращаемый тип
int.var arr = [1, 2, 3, 4, 5, 6, 7] high(arr) # => 6 for i in low(arr)..high(arr): echo arr[i]
См. также:
Исходный код Редактировать proc high[I, T](x: typedesc[array[I, T]]): I {.magic: "High", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Возвращает максимальный возможный индекс типа массива.
Для пустых массивов возвращаемый тип
int.high(array[7, int]) # => 6
См. также:
Исходный код Редактировать proc high[T: Ordinal | enum | range](x: T): T {.magic: "High", noSideEffect, ...deprecated: "Deprecated since v1.4; there should not be `high(value)`. Use `high(type)`.", raises: [], tags: [], forbids: [].}-
Возвращает максимальное возможное значение порядкового значения
x.В качестве специального семантического правила
xможет также быть идентификатором типа.Эта процедура устарела, используйте эту вместо неё:
high(2) # => 9223372036854775807
Исходный код Редактировать proc high[T: Ordinal | enum | range](x: typedesc[T]): T {.magic: "High", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Возвращает максимальное возможное значение порядкового или перечислимого типа.
high(int)- это способ написания Nim INT_MAX или MAX_INT.high(int) # => 9223372036854775807
См. также:
Исходный код Редактировать proc high[T](x: openArray[T]): int {.magic: "High", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Возвращает максимальный возможный индекс последовательности
x.var s = @[1, 2, 3, 4, 5, 6, 7] high(s) # => 6 for i in low(s)..high(s): echo s[i]
См. также:
Исходный код Редактировать proc inc[T, V: Ordinal](x: var T; y: V = 1) {.magic: "Inc", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Увеличивает порядковый номер
xнаy.Если такого значения не существует,
OverflowDefectили происходит ошибка компиляции. Это сокращённая запись для:x = succ(x, y).Пример:
var i = 2 inc(i) assert i == 3 inc(i, 3) assert i == 6
Исходный код Редактировать func incl[T](x: var set[T]; y: T) {.magic: "Incl", ...raises: [], tags: [], forbids: [].}-
Включает элемент
yв множествоx.Это то же самое, что
x = x + {y}, но может быть более эффективным.Пример:
var a = {1, 3, 5} a.incl(2) assert a == {1, 2, 3, 5} a.incl(4) assert a == {1, 2, 3, 4, 5}Исходный код Редактировать
proc insert(x: var string; item: string; i = 0.Natural) {.noSideEffect, ...raises: [], tags: [], forbids: [].}-
Вставляет
itemвxв позицииi.var a = "abc" a.insert("zz", 0) # a <- "zzabc"Исходный код Редактировать proc insert[T](x: var seq[T]; item: sink T; i = 0.Natural) {.noSideEffect.}-
Вставляет
itemвxв позицииi.var i = @[1, 3, 5] i.insert(99, 0) # i <- @[99, 1, 3, 5]
Исходный код Редактировать proc instantiationInfo(index = -1; fullPaths = false): tuple[filename: string, line: int, column: int] {.magic: "InstantiationInfo", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Обеспечивает доступ к информации о строке стека экземпляции компилятора для шаблона.
Хотя похожа на информацию о вызывающей процедуре (caller info) других языков, она определяется на этапе компиляции.
Эта процедура в основном полезна для метапрограммирования (например,
assertшаблон), чтобы извлечь информацию о текущем имени файла и номере строки. Пример:import std/strutils template testException(exception, code: untyped): typed = try: let pos = instantiationInfo() discard(code) echo "Test failure at $1:$2 with '$3'" % [pos.filename, $pos.line, astToStr(code)] assert false, "A test expecting failure succeeded?" except exception: discard proc tester(pos: int): int = let a = @[1, 2, 3] result = a[pos] when isMainModule: testException(IndexDefect, tester(30)) testException(IndexDefect, tester(1)) # --> Test failure at example.nim:20 with 'tester(1)'Исходный код Редактировать proc `is`[T, S](x: T; y: S): bool {.magic: "Is", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Проверяет, является ли
Tтого же типа, что иS.Для отрицательного варианта используйте isnot.
assert 42 is int assert @[1, 2] is seq proc test[T](a: T): int = when (T is int): return a else: return 0 assert(test[int](3) == 3) assert(test[string]("xyz") == 0)Исходный код Редактировать proc isNil(x: cstring): bool {.noSideEffect, magic: "IsNil", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc isNil(x: pointer): bool {.noSideEffect, magic: "IsNil", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc isNil[T: proc | iterator {.closure.}](x: T): bool {.noSideEffect, magic: "IsNil", ...raises: [], tags: [], forbids: [].}- Быстрая проверка, является ли
xнулевым. Иногда это более эффективно, чем== nil. Исходный код Редактировать proc isNil[T](x: ptr T): bool {.noSideEffect, magic: "IsNil", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc isNil[T](x: ref T): bool {.noSideEffect, magic: "IsNil", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc isNotForeign(x: ForeignCell): bool {....raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc isUniqueRef[T](x: ref T): bool {.inline.}- Возвращает true, если объект, на который указывает
x, имеет единственную ссылку. Такой объект потенциально может безопасно передаваться в другую нить, если соблюдаются все меры предосторожности. Эта процедура запрашивает внутренний счетчик ссылок объекта, который подвержен множеству оптимизаций! Другими словами, значениеisUniqueRefможет зависеть от используемой версии компилятора и настроек оптимизатора. Тем не менее, он может служить очень ценным инструментом отладки и может использоваться для указания ограничений API, связанных с многопоточностью, черезassert isUniqueRef(x). Исходный код Редактировать proc iterToProc(iter: typed; envType: typedesc; procName: untyped) {. magic: "Plugin", compileTime, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
func len(x: (type array) | array): int {.magic: "LengthArray", ...raises: [], tags: [], forbids: [].}- Возвращает длину массива или типа массива. Примерно то же самое, что и
high(T)-low(T)+1.Пример:
var a = [1, 1, 1] assert a.len == 3 assert array[0, float].len == 0 static: assert array[-2..2, float].len == 5
Исходный код Редактировать proc len(x: cstring): int {.magic: "LengthStr", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Возвращает длину совместимой строки. Это операция O(n), за исключением js во время выполнения.
Примечание: На JS-бекенде в настоящее время подсчитываются кодовые точки UTF-16 вместо байтов во время выполнения (не на этапе компиляции). Пока что, если вам нужна длина байтов UTF-8 кодирования, сначала преобразуйте в строку с помощью
$, а затем вызовитеlen.Пример:
doAssert len(cstring"abc") == 3 doAssert len(cstring r"ab\0c") == 5 # \0 is escaped doAssert len(cstring"ab\0c") == 5 # ditto var a: cstring = "ab\0c" when defined(js): doAssert a.len == 4 # len ignores \0 for js else: doAssert a.len == 2 # \0 is a null terminator static: var a2: cstring = "ab\0c" doAssert a2.len == 2 # \0 is a null terminator, even in js vm
Исходный код Редактировать func len(x: string): int {.magic: "LengthStr", ...raises: [], tags: [], forbids: [].}- Возвращает длину строки.
Пример:
assert "abc".len == 3 assert "".len == 0 assert string.default.len == 0
Исходный код Редактировать func len[T](x: seq[T]): int {.magic: "LengthSeq", ...raises: [], tags: [], forbids: [].}- Возвращает длину
x.Пример:
assert @[0, 1].len == 2 assert seq[int].default.len == 0 assert newSeq[int](3).len == 3 let s = newSeqOfCap[int](3) assert s.len == 0
Исходный код Редактировать func len[T](x: set[T]): int {.magic: "Card", ...raises: [], tags: [], forbids: [].}- Псевдоним для
card(x). Исходный код Редактировать func len[TOpenArray: openArray | varargs](x: TOpenArray): int {. magic: "LengthOpenArray", ...raises: [], tags: [], forbids: [].}- Возвращает длину openArray.
Пример:
proc bar[T](a: openArray[T]): int = len(a) assert bar([1,2]) == 2 assert [1,2].len == 2
Исходный код Редактировать proc len[U: Ordinal; V: Ordinal](x: HSlice[U, V]): int {.noSideEffect, inline.}-
Длина порядкового среза. Если x.b < x.a, возвращает длину ноль.
assert((0..5).len == 6) assert((5..2).len == 0)
Исходный код Редактировать proc locals(): RootObj {.magic: "Plugin", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Генерирует выражение конструктора кортежа, перечисляя все локальные переменные в текущем области видимости.
Это довольно быстро, так как не использует никакой отладочной или информации о времени выполнения. Обратите внимание, что в отличие от того, что говорит официальная подпись, тип возврата не
RootObj, а кортеж структуры, зависящей от текущей области видимости. Пример:proc testLocals() = var a = "something" b = 4 c = locals() d = "super!" b = 1 for name, value in fieldPairs(c): echo "name ", name, " with value ", value echo "B is ", b # -> name a with value something # -> name b with value 4 # -> B is 1Исходный код Редактировать
proc low(T: typedesc[SomeFloat]): T:type
- Исходный код Редактировать
proc low(x: cstring): int {.magic: "Low", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Возвращает минимальный возможный индекс совместимой строки
x.См. также:
Исходный код Редактировать proc low(x: string): int {.magic: "Low", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Возвращает минимальный возможный индекс строки
x.var str = "Hello world!" low(str) # => 0
См. также:
Исходный код Редактировать proc low[I, T](x: array[I, T]): I {.magic: "Low", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Возвращает минимальный возможный индекс массива
x.Для пустых массивов тип возврата —
int.var arr = [1, 2, 3, 4, 5, 6, 7] low(arr) # => 0 for i in low(arr)..high(arr): echo arr[i]
См. также:
Исходный код Редактировать proc low[I, T](x: typedesc[array[I, T]]): I {.magic: "Low", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Возвращает минимальный возможный индекс типа массива.
Для пустых массивов тип возврата —
int.low(array[7, int]) # => 0
См. также:
Исходный код Редактировать proc low[T: Ordinal | enum | range](x: T): T {.magic: "Low", noSideEffect, ...deprecated: "Deprecated since v1.4; there should not be `low(value)`. Use `low(type)`.", raises: [], tags: [], forbids: [].}-
Возвращает минимальное возможное значение порядкового значения
x. В качестве специального семантического правилаxможет также быть идентификатором типа.Эта процедура устарела, используйте вместо неё:
low(2) # => -9223372036854775808
Исходный код Редактировать proc low[T: Ordinal | enum | range](x: typedesc[T]): T {.magic: "Low", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Возвращает минимальное возможное значение порядкового или перечисления типа.
low(int)— способ написания Nim INT_MIN или MIN_INT.low(int) # => -9223372036854775808
См. также:
Исходный код Редактировать proc low[T](x: openArray[T]): int {.magic: "Low", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Возвращает минимальный возможный индекс последовательности
x.var s = @[1, 2, 3, 4, 5, 6, 7] low(s) # => 0 for i in low(s)..high(s): echo s[i]
См. также:
Исходный код Редактировать proc max(x, y: float32): float32 {.noSideEffect, inline, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc max(x, y: float64): float64 {.noSideEffect, inline, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc max(x, y: int): int {.magic: "MaxI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc max(x, y: int8): int8 {.magic: "MaxI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc max(x, y: int16): int16 {.magic: "MaxI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc max(x, y: int32): int32 {.magic: "MaxI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc max(x, y: int64): int64 {.magic: "MaxI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Максимальное значение двух целых чисел. Исходный код Редактировать
proc max[T: not SomeFloat](x, y: T): T {.inline.}- Общий оператор нахождения максимального значения из 2 значений на основе
<=. Исходный код Редактировать proc max[T](x: openArray[T]): T
- Максимальное значение
x.Tнеобходимо иметь оператор<. Исходный код Редактировать proc min(x, y: float32): float32 {.noSideEffect, inline, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc min(x, y: float64): float64 {.noSideEffect, inline, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc min(x, y: int): int {.magic: "MinI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc min(x, y: int8): int8 {.magic: "MinI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc min(x, y: int16): int16 {.magic: "MinI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc min(x, y: int32): int32 {.magic: "MinI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc min(x, y: int64): int64 {.magic: "MinI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Минимальное значение двух целых чисел. Исходный код Редактировать
proc min[T: not SomeFloat](x, y: T): T {.inline.}- Общий оператор нахождения минимального значения из 2 значений на основе
<=. Исходный код Редактировать proc min[T](x: openArray[T]): T
- Минимальное значение
x.Tнеобходимо иметь оператор<. Исходный код Редактировать
proc `mod`(x, y: int): int {.magic: "ModI", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Вычисляет целочисленную операцию modulo (остаток).
Это то же самое, что и
x - (x div y) * y.Пример:
assert (7 mod 5) == 2 assert (-7 mod 5) == -2 assert (7 mod -5) == 2 assert (-7 mod -5) == -2
Исходный код Изменить proc `mod`(x, y: int8): int8 {.magic: "ModI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `mod`(x, y: int16): int16 {.magic: "ModI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `mod`(x, y: int32): int32 {.magic: "ModI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `mod`(x, y: int64): int64 {.magic: "ModI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `mod`(x, y: uint): uint {.magic: "ModU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Вычисляет целочисленную операцию modulo (остаток) для беззнаковых целых чисел. Это то же самое, что и
x - (x div y) * y. Исходный код Изменить proc `mod`(x, y: uint8): uint8 {.magic: "ModU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `mod`(x, y: uint16): uint16 {.magic: "ModU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `mod`(x, y: uint32): uint32 {.magic: "ModU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `mod`(x, y: uint64): uint64 {.magic: "ModU", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc move[T](x: var T): T {.magic: "Move", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc moveMem(dest, source: pointer; size: Natural) {.inline, ...gcsafe, tags: [], raises: [], forbids: [].}-
Копирует содержимое памяти по адресу
sourceв память по адресуdest.Будет скопировано ровно
Исходный код Изменитьsizeбайт. Области памяти могут перекрываться,moveMemкорректно обрабатывает этот случай и поэтому несколько безопаснее, чемcopyMem. Однако, как любая процедура, работающая с сырой памятью, она всё ещё является небезопасной. proc new(t: typedesc): auto
-
Создает новый объект типа
Tи возвращает безопасную (отслеживаемую) ссылку на него в качестве результата.Когда
Исходный код ИзменитьTявляется типом ref, то результирующий тип будетT, в противном случае он будетref T. proc new[T](a: var ref T) {.magic: "New", noSideEffect, ...raises: [], tags: [], forbids: [].}- Создает новый объект типа
Tи возвращает безопасную (отслеживаемую) ссылку на него вa. Исходный код Изменить proc new[T](a: var ref T; finalizer: proc (x: ref T) {.nimcall.}) {. magic: "NewFinalize", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Создает новый объект типа
Tи возвращает безопасную (отслеживаемую) ссылку на него вa.Когда сборщик мусора освобождает объект, вызывается
finalizer.finalizerможет не сохранять ссылку на объект, на который указываетx.finalizerне может предотвратить освобождение объекта сборщиком мусора.Примечание:
Исходный код Изменитьfinalizerотносится к типуT, а не к объекту! Это означает, что для каждого объекта типаTбудет вызван финализатор! proc newSeq[T](len = 0.Natural): seq[T]
-
Создает новую последовательность типа
seq[T]длинойlen.Обратите внимание, что последовательность будет заполнена нулевыми элементами. После создания последовательности вы должны назначить значения элементам последовательности, а не добавлять их.
var inputStrings = newSeq[string](3) assert len(inputStrings) == 3 inputStrings[0] = "The fourth" inputStrings[1] = "assignment" inputStrings[2] = "would crash" #inputStrings[3] = "out of bounds"
См. также:
Исходный код Изменить proc newSeq[T](s: var seq[T]; len: Natural) {.magic: "NewSeq", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Создает новую последовательность типа
seq[T]длинойlen.Это эквивалентно
s = @[]; setlen(s, len), но более эффективно, так как перераспределения не требуется.Обратите внимание, что последовательность будет заполнена нулевыми элементами. После создания последовательности вы должны назначить значения элементам последовательности, а не добавлять их. Пример:
var inputStrings: seq[string] newSeq(inputStrings, 3) assert len(inputStrings) == 3 inputStrings[0] = "The fourth" inputStrings[1] = "assignment" inputStrings[2] = "would crash" #inputStrings[3] = "out of bounds"
Исходный код Изменить proc newSeqOfCap[T](cap: Natural): seq[T] {.magic: "NewSeqOfCap", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Создает новую последовательность типа
seq[T]длиной ноль и емкостьюcap. Пример:var x = newSeqOfCap[int](5) assert len(x) == 0 x.add(10) assert len(x) == 1
Исходный код Изменить func newSeqUninit[T](len: Natural): seq[T]
-
Создает новую последовательность типа
seq[T]длинойlen.Доступно только для типов, не содержащих управляемой памяти или не имеющих деструкторов. Обратите внимание, что последовательность не будет инициализирована. После создания последовательности вы должны назначить значения элементам последовательности, а не добавлять их.
Пример:
var x = newSeqUninit[int](3) assert len(x) == 3 x[0] = 10
Исходный код Изменить proc newSeqUninitialized[T: SomeNumber](len: Natural): seq[T] {. ...deprecated: "Use `newSeqUninit` instead".}-
Создает новую последовательность типа
seq[T]длинойlen.Доступно только для числовых типов. Обратите внимание, что последовательность не будет инициализирована. После создания последовательности вы должны назначить значения элементам последовательности, а не добавлять их. Пример:
var x = newSeqUninitialized[int](3) assert len(x) == 3 x[0] = 10
Исходный код Изменить proc newString(len: Natural): string {.magic: "NewString", importc: "mnewString", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Возвращает новую строку длиной
len. Необходимо заполнить строку символами по индексу с помощью оператораs[i].Эта процедура существует только для целей оптимизации; тот же эффект можно достичь с помощью оператора
Исходный код Изменить&или сadd. proc newStringOfCap(cap: Natural): string {.magic: "NewStringOfCap", importc: "rawNewString", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Возвращает новую строку длиной
0но с емкостьюcap.Эта процедура существует только для целей оптимизации; тот же эффект можно достичь с помощью оператора
Исходный код Изменить&или сadd.
proc newStringUninit(len: Natural): string {....raises: [], tags: [], forbids: [].}-
Возвращает новую строку длиной
len, но с неинициализированным содержимым. Необходимо заполнить строку посимвольно с помощью оператора индексаs[i].Эта процедура существует только для оптимизации; тот же эффект можно достичь с помощью оператора
Исходный код Изменить&или с помощьюadd. proc `not`(a: typedesc): typedesc {.magic: "TypeTrait", noSideEffect, ...raises: [], tags: [], forbids: [].}- Создаёт метакласс
not. Исходный код Изменить proc `not`(x: bool): bool {.magic: "Not", noSideEffect, ...raises: [], tags: [], forbids: [].}- Логическое отрицание; возвращает true, если
x == false. Исходный код Изменить proc `not`(x: int): int {.magic: "BitnotI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Вычисляет
bitwise complementцелого числаx.Пример:
assert not 0'u8 == 255 assert not 0'i8 == -1 assert not 1000'u16 == 64535 assert not 1000'i16 == -1001
Исходный код Изменить proc `not`(x: int8): int8 {.magic: "BitnotI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `not`(x: int16): int16 {.magic: "BitnotI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `not`(x: int32): int32 {.magic: "BitnotI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `not`(x: int64): int64 {.magic: "BitnotI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `not`(x: uint): uint {.magic: "BitnotI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Вычисляет
bitwise complementцелого числаx. Исходный код Изменить proc `not`(x: uint8): uint8 {.magic: "BitnotI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `not`(x: uint16): uint16 {.magic: "BitnotI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `not`(x: uint32): uint32 {.magic: "BitnotI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `not`(x: uint64): uint64 {.magic: "BitnotI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `of`[T, S](x: T; y: typedesc[S]): bool {.magic: "Of", noSideEffect, ...raises: [], tags: [], forbids: [].}- Проверяет, является ли
xэкземпляромy.Пример:
type Base = ref object of RootObj Sub1 = ref object of Base Sub2 = ref object of Base Unrelated = ref object var base: Base = Sub1() # downcast doAssert base of Base # generates `CondTrue` (statically true) doAssert base of Sub1 doAssert base isnot Sub1 doAssert not (base of Sub2) base = Sub2() # re-assign doAssert base of Sub2 doAssert Sub2(base) != nil # upcast doAssertRaises(ObjectConversionDefect): discard Sub1(base) var sub1 = Sub1() doAssert sub1 of Base doAssert sub1.Base of Sub1 doAssert not compiles(base of Unrelated)
Исходный код Изменить proc onThreadDestruction(handler: proc () {.closure, ...gcsafe, raises: [].}) {. ...raises: [], tags: [], forbids: [].}-
Регистрирует обработчик локальный для потока, который вызывается при уничтожении потока.
Поток уничтожается, когда процедура
Исходный код Изменить.threadвозвращается нормально или когда она вызывает исключение. Обратите внимание, что необработанные исключения в потоке тем не менее приводят к смерти всего процесса. proc open[TMsg](c: var Channel[TMsg]; maxItems: int = 0)
-
Открывает канал
cдля межпоточной связи.Операция
sendбудет блокироваться, пока количество необработанных элементов не станет меньшеmaxItems.Для неограниченной очереди установите
Исходный код ИзменитьmaxItemsв 0. proc `or`(a, b: typedesc): typedesc {.magic: "TypeTrait", noSideEffect, ...raises: [], tags: [], forbids: [].}- Создаёт метакласс
or. Исходный код Изменить proc `or`(x, y: bool): bool {.magic: "Or", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Логическое
or; возвращает true, еслиnot (not x and not y)(если любой из аргументов равен true).Вычисление ленивое: если
Исходный код Изменитьxравно true,yдаже не будет вычислено. proc `or`(x, y: int): int {.magic: "BitorI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Вычисляет
bitwise orчиселxиy.Пример:
assert (0b0011 or 0b0101) == 0b0111 assert (0b0111 or 0b1100) == 0b1111
Исходный код Изменить proc `or`(x, y: int8): int8 {.magic: "BitorI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `or`(x, y: int16): int16 {.magic: "BitorI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `or`(x, y: int32): int32 {.magic: "BitorI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `or`(x, y: int64): int64 {.magic: "BitorI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `or`(x, y: uint): uint {.magic: "BitorI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Вычисляет
bitwise orчиселxиy. Исходный код Изменить proc `or`(x, y: uint8): uint8 {.magic: "BitorI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `or`(x, y: uint16): uint16 {.magic: "BitorI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `or`(x, y: uint32): uint32 {.magic: "BitorI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
proc `or`(x, y: uint64): uint64 {.magic: "BitorI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Изменить
func ord[T: Ordinal | enum](x: T): int {.magic: "Ord", ...raises: [], tags: [], forbids: [].}- Возвращает внутреннее значение
intx, включая перечисления с пропущенными значениями и разные типы порядковых чисел.Пример:
assert ord('A') == 65 type Foo = enum f0 = 0, f1 = 3 assert f1.ord == 3 type Bar = distinct int assert 3.Bar.ord == 3Исходный код Изменить
proc peek[TMsg](c: var Channel[TMsg]): int
-
Возвращает текущее количество сообщений в канале
c.Возвращает -1, если канал закрыт.
Примечание: Использование данной функции опасно, так как она способствует возникновению гонок. Лучше использовать процедуру tryRecv вместо неё.
Исходный код Редактировать proc pop[T](s: var seq[T]): T {.inline, noSideEffect.}-
Возвращает последний элемент
sи уменьшаетs.lenна единицу. Это рассматриваетsкак стек и реализует общую операцию pop.Вызывает
IndexDefectеслиsпустой.Пример:
var a = @[1, 3, 5, 7] let b = pop(a) assert b == 7 assert a == @[1, 3, 5]
Исходный код Редактировать proc pred[T, V: Ordinal](x: T; y: V = 1): T {.magic: "Pred", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Возвращает предшественника значения
x(по умолчанию: 1).Если такого значения нет, вызывается
OverflowDefectили происходит ошибка во время компиляции.Пример:
assert pred(5) == 4 assert pred(5, 3) == 2
Исходный код Редактировать proc prepareMutation(s: var string) {.inline, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc procCall(x: untyped) {.magic: "ProcCall", compileTime, ...raises: [], tags: [], forbids: [].}-
Специальная магическая функция для запрета динамической привязки для вызовов метода. Это аналогично super в обычных языках ООП.
# 'someMethod' will be resolved fully statically: procCall someMethod(a, b)
Исходный код Редактировать proc protect(x: pointer): ForeignCell {....raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc quit(errorcode: int = QuitSuccess) {.magic: "Exit", noreturn, ...raises: [], tags: [], forbids: [].}-
Немедленно останавливает программу с кодом завершения.
Перед остановкой программы вызываются "процедуры завершения" в обратном порядке, в котором они были добавлены с помощью addExitProc.
Процедура
quit(QuitSuccess)вызывается неявно, когда ваша программа Nim завершается без ошибок для платформ, где это ожидаемое поведение. Вызванная необработанная исключительная ситуация эквивалентна вызовуquit(QuitFailure).Обратите внимание, что это вызов времени выполнения, и использование
quitвнутри макроса не повлияет на время компиляции. Если вам нужно остановить компилятор внутри макроса, используйте директивы error или fatal.Предупреждение:errorcodeпереполняется, когда превышает допустимый диапазон на конкретной платформе. На Posix допустимый диапазонlow(int8)..high(int8). На Windows допустимый диапазонlow(int32)..high(int32). Например,quit(int(0x100000000))равноquit(127)на Linux.Внимание: В большинстве случаев, особенно в коде библиотек, предпочтительны альтернативы, напримерИсходный код РедактироватьraiseAssertили поднятиеDefect.quitобходит стандартный поток управления, особенноdefer,try,catch,finallyиdestructors, и исключения, которые могли быть вызваны процедуройaddExitProc, а также код очистки в других потоках. Он не вызывает сборщик мусора для освобождения всей памяти, если процедураaddExitProcне вызывает GC_fullCollect. proc quit(errormsg: string; errorcode = QuitFailure) {.noreturn, ...raises: [], tags: [], forbids: [].}- Краткая форма
echo(errormsg); quit(errorcode). Исходный код Редактировать proc rawEnv[T: proc {.closure.} | iterator {.closure.}](x: T): pointer {. noSideEffect, inline.}- Получает указатель на исходную среду закрытия
x. См. такжеrawProc. Эта функция недоступна для целевой платформы JS. Исходный код Редактировать proc rawProc[T: proc {.closure.} | iterator {.closure.}](x: T): pointer {. noSideEffect, inline.}- Получает исходный указатель на процедуру закрытия
x. Это полезно для взаимодействия замыканий с C/C++, вычислений хешей и т. д. ЕслиrawEnv(x)возвращаетnil, процедура, на которую указывает результат, принимает столько же параметров, сколькоx, но с соглашением вызова{.nimcall.}вместо{.closure.}, иначе она принимает еще один параметр, который являетсяpointer, и все еще использует соглашение вызова{.nimcall.}. Для вызова полученной процедуры возвращаемое значение необходимо привести к типуproc, а неptr proc, и в случае, когдаrawEnv(x)возвращает не-nil, последний и дополнительный аргумент должен быть результатомrawEnv(x). Эта функция недоступна для целевой платформы JS.Пример:
proc makeClosure(x: int): (proc(y: int): int) = var n = x result = ( proc(y: int): int = n += y return n ) var c1 = makeClosure(10) e = c1.rawEnv() p = c1.rawProc() if e.isNil(): let c2 = cast[proc(y: int): int {.nimcall.}](p) echo c2(2) else: let c3 = cast[proc(y: int; env: pointer): int {.nimcall.}](p) echo c3(3, e)Исходный код Редактировать proc ready[TMsg](c: var Channel[TMsg]): bool
- Возвращает true, если какой-то поток ожидает на канале
cновых сообщений. Исходный код Редактировать proc realloc0Impl(p: pointer; oldSize, newSize: Natural): pointer {.noconv, ...gcsafe, tags: [], gcsafe, raises: [], forbids: [].}- Исходный код Редактировать
proc reallocImpl(p: pointer; newSize: Natural): pointer {.noconv, ...gcsafe, tags: [], gcsafe, raises: [], forbids: [].}- Исходный код Редактировать
proc recv[TMsg](c: var Channel[TMsg]): TMsg
-
Принимает сообщение из канала
c.Эта операция блокируется, пока сообщение не придёт! Используйте peek процедуру чтобы избежать блокировки.
Исходный код Редактировать proc repr[T, U](x: HSlice[T, U]): string
-
Общая операция
reprдля слайсов, которая взята из компонентовx. Пример:$(1 .. 5) == "1 .. 5"
Исходный код Редактировать proc reset[T](obj: var T) {.noSideEffect.}- Сбрасывает объект
objдо его значения по умолчанию. Исходный код Редактировать proc resize[T](p: ptr T; newSize: Natural): ptr T {.inline, ...gcsafe, raises: [].}-
Увеличивает или уменьшает заданный блок памяти.
Если
pравно nil, возвращается новый блок памяти. В любом случае размер блока составляет как минимумT.sizeof * newSizeбайта. ЕслиnewSize == 0иpне равны nil,resizeвызываетdealloc(p). В других случаях блок памяти нужно освободить с помощьюfree.Выделенная память принадлежит потоку, который её выделил! Используйте resizeShared для выделения из общей кучи.
Исходный код Редактировать
proc runnableExamples(rdoccmd = ""; body: untyped) {.magic: "RunnableExamples", ...raises: [], tags: [], forbids: [].}- Раздел, который следует использовать для маркировки кода примера, который можно запустить с.
- В обычных сборках отладки и релизных сборках код внутри раздела
runnableExamplesигнорируется. - Генератор документации осведомлен об этих примерах и рассматривает их как часть комментария документации
##. В качестве последнего шага генерации документации каждый runnableExample помещается в свой файл$file_examples$i.nim, компилируется и тестируется. Собраные примеры помещаются в собственный модуль, чтобы убедиться, что примеры не ссылаются на неэкспортированные символы.
Пример:
proc timesTwo*(x: int): int = ## This proc doubles a number. runnableExamples: # at module scope const exported* = 123 assert timesTwo(5) == 10 block: # at block scope defer: echo "done" runnableExamples "-d:foo -b:cpp": import std/compilesettings assert querySetting(backend) == "cpp" assert defined(foo) runnableExamples "-r:off": ## this one is only compiled import std/browsers openDefaultBrowser "https://forum.nim-lang.org/" 2 * xИсходный код Редактировать - В обычных сборках отладки и релизных сборках код внутри раздела
proc send[TMsg](c: var Channel[TMsg]; msg: sink TMsg) {.inline.}- Отправка сообщения в поток.
msgглубоко копируется. Исходный код Редактировать proc setControlCHook(hook: proc () {.noconv.}) {....raises: [], tags: [], forbids: [].}-
Позволяет переопределить поведение вашего приложения при нажатии CTRL+C. Поддерживается только один такой обработчик. Пример:
proc ctrlc() {.noconv.} = echo "Ctrl+C fired!" # do clean up stuff quit() setControlCHook(ctrlc)Исходный код Редактировать proc setCurrentException(exc: ref Exception) {.inline, ...gcsafe, raises: [], tags: [], forbids: [].}- Устанавливает текущее исключение.Предупреждение: Используйте только в том случае, если вы знаете, что делаете.Исходный код Редактировать
proc setFrame(s: PFrame) {.compilerproc, inline, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc setFrameState(state: FrameState) {.compilerproc, inline, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc setLen(s: var string; newlen: Natural) {.magic: "SetLengthStr", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Устанавливает длину строки
sнаnewlen.Если текущая длина больше новой длины,
sбудет усечена.var myS = "Nim is great!!" myS.setLen(3) # myS <- "Nim" echo myS, " is fantastic!!"
Исходный код Редактировать proc setLen[T](s: var seq[T]; newlen: Natural) {.magic: "SetLengthSeq", noSideEffect, nodestroy, ...raises: [], tags: [], forbids: [].}-
Устанавливает длину последовательности
sнаnewlen.Tможет быть любым типом последовательности.Если текущая длина больше новой длины,
sбудет усечена.var x = @[10, 20] x.setLen(5) x[4] = 50 assert x == @[10, 20, 0, 0, 50] x.setLen(1) assert x == @[10]
Исходный код Редактировать func setLenUninit[T](s: var seq[T]; newlen: Natural) {.nodestroy.}-
Устанавливает длину последовательности
sнаnewlen.Tможет быть любым типом последовательности. Новые слоты не будут инициализированы.Если текущая длина больше новой длины,
sбудет усечена.var x = @[10, 20] x.setLenUninit(5) x[4] = 50 assert x[4] == 50 x.setLenUninit(1) assert x == @[10]
Исходный код Редактировать proc `shl`(x: int8; y: SomeInteger): int8 {.magic: "ShlI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `shl`(x: int16; y: SomeInteger): int16 {.magic: "ShlI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `shl`(x: int32; y: SomeInteger): int32 {.magic: "ShlI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `shl`(x: int64; y: SomeInteger): int64 {.magic: "ShlI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `shl`(x: int; y: SomeInteger): int {.magic: "ShlI", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Вычисляет операцию
shift leftдляxиy.Примечание: Приоритет операторов отличается от C.
Пример:
assert 1'i32 shl 4 == 0x0000_0010 assert 1'i64 shl 4 == 0x0000_0000_0000_0010
Исходный код Редактировать proc `shl`(x: uint8; y: SomeInteger): uint8 {.magic: "ShlI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `shl`(x: uint16; y: SomeInteger): uint16 {.magic: "ShlI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `shl`(x: uint32; y: SomeInteger): uint32 {.magic: "ShlI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `shl`(x: uint64; y: SomeInteger): uint64 {.magic: "ShlI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `shl`(x: uint; y: SomeInteger): uint {.magic: "ShlI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Вычисляет операцию
shift leftдляxиy. Исходный код Редактировать
proc `shr`(x: int8; y: SomeInteger): int8 {.magic: "AshrI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `shr`(x: int16; y: SomeInteger): int16 {.magic: "AshrI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `shr`(x: int32; y: SomeInteger): int32 {.magic: "AshrI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `shr`(x: int64; y: SomeInteger): int64 {.magic: "AshrI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `shr`(x: int; y: SomeInteger): int {.magic: "AshrI", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Вычисляет операцию
shift rightнадxиy, заполняя свободные битовые позиции битом знака.Примечание: Приоритет операторов отличается от C.
См. также:
- Функция ashr для арифметического сдвига вправо
Пример:
assert 0b0001_0000'i8 shr 2 == 0b0000_0100'i8 assert 0b0000_0001'i8 shr 1 == 0b0000_0000'i8 assert 0b1000_0000'i8 shr 4 == 0b1111_1000'i8 assert -1 shr 5 == -1 assert 1 shr 5 == 0 assert 16 shr 2 == 4 assert -16 shr 2 == -4
Исходный код Редактировать proc `shr`(x: uint8; y: SomeInteger): uint8 {.magic: "ShrI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `shr`(x: uint16; y: SomeInteger): uint16 {.magic: "ShrI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `shr`(x: uint32; y: SomeInteger): uint32 {.magic: "ShrI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `shr`(x: uint64; y: SomeInteger): uint64 {.magic: "ShrI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `shr`(x: uint; y: SomeInteger): uint {.magic: "ShrI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Вычисляет операцию
shift rightнадxиy. Исходный код Редактировать proc shrink[T](x: var seq[T]; newLen: Natural) {....tags: [], raises: [].}- Исходный код Редактировать
proc sizeof(x: typedesc): int {.magic: "SizeOf", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc sizeof[T](x: T): int {.magic: "SizeOf", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Возвращает размер
xв байтах.Поскольку это процедура низкого уровня, её использование не рекомендуется — в большинстве случаев достаточно использовать new, чтобы никогда не знать размер
x.В качестве специального семантического правила,
xможет также быть идентификатором типа (sizeof(int)допустимо).Ограничения: Если используется для типов, импортированных из C или C++, sizeof должен перейти к
sizeofв компиляторе C. Результат недоступен для компилятора Nim и поэтому не может использоваться внутри макросов.sizeof('A') # => 1 sizeof(2) # => 8Исходный код Редактировать proc slurp(filename: string): string {.magic: "Slurp", ...raises: [], tags: [], forbids: [].}- Это псевдоним для staticRead. Исходный код Редактировать
proc stackTraceAvailable(): bool {....raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc staticExec(command: string; input = ""; cache = ""): string {. magic: "StaticExec", ...raises: [], tags: [], forbids: [].}-
Выполняет внешний процесс во время компиляции и возвращает вывод текста (stdout + stderr).
Если
inputне пустая строка, она будет передана как стандартный ввод исполняемой программе.const buildInfo = "Revision " & staticExec("git rev-parse HEAD") & "\nCompiled on " & staticExec("uname -v")gorge является псевдонимом для
staticExec.Обратите внимание, что вы можете использовать эту процедуру внутри псевдокода, например, passc или passl.
Если
cacheне пустая, результатыstaticExecкешируются в каталогеnimcache. Используйте--forceBuildдля отключения этого поведения кэширования.command & input & cache(склеенная строка) используется для определения того, является ли запись в кэше по-прежнему актуальной. Вы можете использовать информацию о версии дляcache.const stateMachine = staticExec("dfaoptimizer", "input", "0.8.0")Исходный код Редактировать proc staticRead(filename: string): string {.magic: "Slurp", ...raises: [], tags: [], forbids: [].}-
Процедура readFile во время компиляции для простого внедрения ресурсов:
Максимальный предел размера файла, который могут читать
staticReadиslurp, равен или близок к свободной памяти используемого вами устройства для компиляции.const myResource = staticRead"mydatafile.bin"
slurp является псевдонимом для
Исходный код РедактироватьstaticRead. proc substr(s: openArray[char]): string {....raises: [], tags: [], forbids: [].}- Копирует фрагмент
sв новую строку и возвращает эту новую строку.Пример:
let a = "abcdefgh" assert a.substr(2, 5) == "cdef" assert a.substr(2) == "cdefgh" assert a.substr(5, 99) == "fgh"
Исходный код Редактировать proc substr(s: string; first = 0): string {....raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc substr(s: string; first, last: int): string {....raises: [], tags: [], forbids: [].}-
Копирует фрагмент
sв новую строку и возвращает эту новую строку.Границы
firstиlastобозначают индексы первого и последнего символов, которые будут скопированы. Еслиlastопущено, оно обрабатывается какhigh(s). Еслиlast >= s.len,s.lenиспользуется вместо этого: Это означает, чтоsubstrтакже может использоваться для вырезания или ограничения длины строки.Пример:
let a = "abcdefgh" assert a.substr(2, 5) == "cdef" assert a.substr(2) == "cdefgh" assert a.substr(5, 99) == "fgh"
Исходный код Редактировать proc succ[T, V: Ordinal](x: T; y: V = 1): T {.magic: "Succ", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Возвращает
y-й преемник (по умолчанию: 1) значенияx.Если такого значения не существует,
OverflowDefectгенерируется или возникает ошибка во время компиляции.Пример:
assert succ(5) == 6 assert succ(5, 3) == 8
Исходный код Редактировать proc swap[T](a, b: var T) {.magic: "Swap", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Меняет местами значения
aиb.Это часто более эффективно, чем
tmp = a; a = b; b = tmp. Особенно полезно для сортирующих алгоритмов.var a = 5 b = 9 swap(a, b) assert a == 9 assert b == 5
Исходный код Редактировать proc toBiggestFloat(i: BiggestInt): BiggestFloat {.noSideEffect, inline, ...raises: [], tags: [], forbids: [].}- То же, что и toFloat, но для
BiggestIntпоBiggestFloat. Исходный код Редактировать
proc toBiggestInt(f: BiggestFloat): BiggestInt {.noSideEffect, ...raises: [], tags: [], forbids: [].}- То же самое, что и toInt, но для
BiggestFloatпоBiggestInt. Исходный код Редактировать proc toFloat(i: int): float {.noSideEffect, inline, ...raises: [], tags: [], forbids: [].}-
Преобразует целое число
iвfloat. То же самое, что иfloat(i).Если преобразование не выполняется, генерируется
ValueError. Однако на большинстве платформ преобразование не может завершиться ошибкой.let a = 2 b = 3.7 echo a.toFloat + b # => 5.7
Исходный код Редактировать proc toInt(f: float): int {.noSideEffect, ...raises: [], tags: [], forbids: [].}-
Преобразует число с плавающей запятой
fв целое числоint.Преобразование округляет
fпо правилу "половина от нуля", см. Округление до ближайшего целого в сторону от нуля, в отличие от преобразования типов, которое округляет к нулю.Обратите внимание, что некоторые числа с плавающей запятой (например, бесконечность или даже 1e19) не могут быть точно преобразованы.
doAssert toInt(0.49) == 0 doAssert toInt(0.5) == 1 doAssert toInt(-0.5) == -1 # rounding is symmetrical
Исходный код Редактировать proc toOpenArray(x: cstring; first, last: int): openArray[char] {. magic: "Slice", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc toOpenArray(x: string; first, last: int): openArray[char] {.magic: "Slice", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc toOpenArray[I, T](x: array[I, T]; first, last: I): openArray[T] {. magic: "Slice", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc toOpenArray[T](x: openArray[T]; first, last: int): openArray[T] {. magic: "Slice", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc toOpenArray[T](x: ptr UncheckedArray[T]; first, last: int): openArray[T] {. magic: "Slice", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc toOpenArray[T](x: seq[T]; first, last: int): openArray[T] {.magic: "Slice", ...raises: [], tags: [], forbids: [].}-
Позволяет передать срез
xс элемента поfirstдо элемента поlastв параметрыopenArray[T]без копирования.Пример:
proc test(x: openArray[int]) = doAssert x == [1, 2, 3] let s = @[0, 1, 2, 3, 4] s.toOpenArray(1, 3).test
Исходный код Редактировать proc toOpenArrayByte(x: cstring; first, last: int): openArray[byte] {. magic: "Slice", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc toOpenArrayByte(x: openArray[char]; first, last: int): openArray[byte] {. magic: "Slice", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc toOpenArrayByte(x: seq[char]; first, last: int): openArray[byte] {. magic: "Slice", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc toOpenArrayByte(x: string; first, last: int): openArray[byte] {. magic: "Slice", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc toOpenArrayChar(x: openArray[byte]; first, last: int): openArray[char] {. magic: "Slice", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc tryRecv[TMsg](c: var Channel[TMsg]): tuple[dataAvailable: bool, msg: TMsg]
-
Попытка получить сообщение из канала
c, но это может завершиться ошибкой по разным причинам, включая конкуренцию.В случае неудачи возвращает
Исходный код Редактировать(false, default(msg)), в противном случае(true, msg). proc trySend[TMsg](c: var Channel[TMsg]; msg: sink TMsg): bool {.inline.}-
Попытка отправить сообщение в поток.
msgглубоко копируется. Не блокирует.Возвращает
Исходный код Редактироватьfalseесли сообщение не было отправлено, потому что количество ожидающих элементов в канале превысилоmaxItems. proc typeof(x: untyped; mode = typeOfIter): typedesc {.magic: "TypeOf", noSideEffect, compileTime, ...raises: [], tags: [], forbids: [].}- Встроенная
typeofоперация для доступа к типу выражения. С версии 0.20.0.Пример:
proc myFoo(): float = 0.0 iterator myFoo(): string = yield "abc" iterator myFoo2(): string = yield "abc" iterator myFoo3(): string {.closure.} = yield "abc" doAssert type(myFoo()) is string doAssert typeof(myFoo()) is string doAssert typeof(myFoo(), typeOfIter) is string doAssert typeof(myFoo3) is iterator doAssert typeof(myFoo(), typeOfProc) is float doAssert typeof(0.0, typeOfProc) is float doAssert typeof(myFoo3, typeOfProc) is iterator doAssert not compiles(typeof(myFoo2(), typeOfProc)) # this would give: Error: attempting to call routine: 'myFoo2' # since `typeOfProc` expects a typed expression and `myFoo2()` can # only be used in a `for` context.Исходный код Редактировать proc unsafeAddr[T](x: T): ptr T {.magic: "Addr", noSideEffect, ...raises: [], tags: [], forbids: [].}- Предупреждение:Исходный код Редактировать
unsafeAddr- устаревший псевдоним дляaddr, используйтеaddrвместо него. proc unsafeNew[T](a: var ref T; size: Natural) {.magic: "New", noSideEffect, ...raises: [], tags: [], forbids: [].}-
Создаёт новый объект типа
Tи возвращает безопасную (отслеживаемую) ссылку на него вa.Это небезопасно, так как выделяет объект указанного
size. Используйте только в целях оптимизации, если точно знаете что делаете!См. также:
Исходный код Редактировать proc unsetControlCHook() {....raises: [], tags: [], forbids: [].}- Отменяет вызов setControlCHook. Исходный код Редактировать
proc wasMoved[T](obj: var T) {.inline, noSideEffect.}- Сбрасывает объект
objдо его исходного (двоичного нулевого) значения, чтобы указать, что он был "перемещён", и чтобы его деструктор ничего не делал и, по возможности, был оптимизирован. Исходный код Редактировать proc writeStackTrace() {....tags: [], gcsafe, raises: [], forbids: [].}- Записывает текущий стек вызовов в
stderr. Работает только в отладочных сборках. Поскольку обычно используется для отладки, это объявлено без эффектов ввода-вывода! Исходный код Редактировать
proc `xor`(x, y: bool): bool {.magic: "Xor", noSideEffect, ...raises: [], tags: [], forbids: [].}- Булево
exclusive or; возвращает true, еслиx != y(если любой из аргументов имеет значение true, а другой — false). Исходный код Редактировать proc `xor`(x, y: int): int {.magic: "BitxorI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Вычисляет
bitwise xorчиселxиy.Пример:
assert (0b0011 xor 0b0101) == 0b0110 assert (0b0111 xor 0b1100) == 0b1011
Исходный код Редактировать proc `xor`(x, y: int8): int8 {.magic: "BitxorI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `xor`(x, y: int16): int16 {.magic: "BitxorI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `xor`(x, y: int32): int32 {.magic: "BitxorI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `xor`(x, y: int64): int64 {.magic: "BitxorI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `xor`(x, y: uint): uint {.magic: "BitxorI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Вычисляет
bitwise xorчиселxиy. Исходный код Редактировать proc `xor`(x, y: uint8): uint8 {.magic: "BitxorI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `xor`(x, y: uint16): uint16 {.magic: "BitxorI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `xor`(x, y: uint32): uint32 {.magic: "BitxorI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `xor`(x, y: uint64): uint64 {.magic: "BitxorI", noSideEffect, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
func zeroDefault[T](_: typedesc[T]): T {.magic: "ZeroDefault", ...raises: [], tags: [], forbids: [].}-
Возвращает двоичное представление нулей для типа
T. Оно игнорирует поля по умолчанию объекта.См. также:
Исходный код Редактировать proc zeroMem(p: pointer; size: Natural) {.inline, noSideEffect, ...tags: [], raises: [], forbids: [].}-
Заменяет содержимое памяти по адресу
pзначением 0.Будет заменено ровно
Исходный код Редактироватьsizeбайта. Как и любая процедура, работающая с сырой памятью, это опасно. proc `|`(a, b: typedesc): typedesc
- Исходный код Редактировать
Итераторы
iterator `..`(a, b: int32): int32 {.inline, ...raises: [], tags: [], forbids: [].}-
A type specialized version of
..for convenience so that mixing integer types works better.См. также:
Исходный код Изменить iterator `..`(a, b: int64): int64 {.inline, ...raises: [], tags: [], forbids: [].}-
A type specialized version of
..for convenience so that mixing integer types works better.См. также:
Исходный код Изменить iterator `..`(a, b: uint32): uint32 {.inline, ...raises: [], tags: [], forbids: [].}-
A type specialized version of
..for convenience so that mixing integer types works better.См. также:
Исходный код Изменить iterator `..`(a, b: uint64): uint64 {.inline, ...raises: [], tags: [], forbids: [].}-
A type specialized version of
..for convenience so that mixing integer types works better.См. также:
Исходный код Изменить iterator `..`[T](a, b: T): T {.inline.}-
Alias for
countup(a, b, 1).См. также:
Пример:
import std/sugar let x = collect(newSeq): for i in 3 .. 7: i assert x == @[3, 4, 5, 6, 7]Исходный код Изменить iterator `..<`(a, b: int32): int32 {.inline, ...raises: [], tags: [], forbids: [].}- A type specialized version of
..<for convenience so that mixing integer types works better. Исходный код Изменить iterator `..<`(a, b: int64): int64 {.inline, ...raises: [], tags: [], forbids: [].}- A type specialized version of
..<for convenience so that mixing integer types works better. Исходный код Изменить iterator `..<`(a, b: uint32): uint32 {.inline, ...raises: [], tags: [], forbids: [].}- A type specialized version of
..<for convenience so that mixing integer types works better. Исходный код Изменить iterator `..<`(a, b: uint64): uint64 {.inline, ...raises: [], tags: [], forbids: [].}- A type specialized version of
..<for convenience so that mixing integer types works better. Исходный код Изменить iterator `..<`[T](a, b: T): T {.inline.}- Исходный код Изменить
iterator countdown[T](a, b: T; step: Positive = 1): T {.inline.}-
Считает от порядкового значения
aвниз доb(включительно) с заданным шагом.Tможет быть любым порядковым типом,stepможет быть только положительным.Примечание: Это не считает до
low(int)если T = int по причинам эффективности.Пример:
import std/sugar let x = collect(newSeq): for i in countdown(7, 3): i assert x == @[7, 6, 5, 4, 3] let y = collect(newseq): for i in countdown(9, 2, 3): i assert y == @[9, 6, 3]Исходный код Изменить iterator countup[T](a, b: T; step: Positive = 1): T {.inline.}-
Считает от порядкового значения
aдоb(включительно) с заданным шагом.Tможет быть любым порядковым типом,stepможет быть только положительным.Примечание: Это не считает до
high(int)если T = int по причинам эффективности.Пример:
import std/sugar let x = collect(newSeq): for i in countup(3, 7): i assert x == @[3, 4, 5, 6, 7] let y = collect(newseq): for i in countup(2, 9, 3): i assert y == @[2, 5, 8]Исходный код Изменить iterator `||`[S, T](a: S; b: T; annotation: static string = "parallel for"): T {. inline, magic: "OmpParFor", sideEffect, ...raises: [], tags: [], forbids: [].}-
Итератор параллельного цикла OpenMP. Такой же, как
.., но цикл может выполняться параллельно.annotation— дополнительная аннотация для использования генератором кода. По умолчанию аннотацияparallel for. Подробную информацию см. в Справочнике по синтаксису OpenMP.Обратите внимание, что компилятор отображает это на конструкцию
Исходный код Изменить#pragma omp parallel forOpenMP и поэтому не осведомлён о параллелизме в вашем коде! Будьте осторожны! Более поздние версии||получат надлежащую поддержку генератором кода и сборщиком мусора Nim. iterator `||`[S, T](a: S; b: T; step: Positive; annotation: static string = "parallel for"): T {.inline, magic: "OmpParFor", sideEffect, ...raises: [], tags: [], forbids: [].}-
Итератор параллельного цикла OpenMP с шагом. Такой же, как
countup, но цикл может выполняться параллельно.annotation— дополнительная аннотация для использования генератором кода. По умолчанию аннотацияparallel for. Подробную информацию см. в Справочнике по синтаксису OpenMP.Обратите внимание, что компилятор отображает это на конструкцию
Исходный код Изменить#pragma omp parallel forOpenMP и поэтому не осведомлён о параллелизме в вашем коде! Будьте осторожны! Более поздние версии||получат надлежащую поддержку генератором кода и сборщиком мусора Nim.
Макросы
macro varargsLen(x: varargs[untyped]): int
- возвращает количество аргументов varargs в
xИсходный код Изменить
Шаблоны
template `!=`(x, y: untyped): untyped {.callsite.}- Оператор неравенства. Это сокращение для
not (x == y). Исходный код Редактировать template `&=`(x, y: typed)
-
Обобщённый оператор 'sink' для Nim.
Если не специализирован дальше, является псевдонимом для
Исходный код Редактироватьadd. template `..<`(a, b: untyped): untyped
-
Сокращение для
a .. pred(b).for i in 5 ..< 9: echo i # => 5; 6; 7; 8
Исходный код Редактировать template `..^`(a, b: untyped): untyped
- Сокращение для
.. ^для избежания распространённой ошибки, когда требуется пробел между '..' и '^'. Исходный код Редактировать template `=dispose`[T](x: owned(ref T))
- Исходный код Редактировать
template `>`(x, y: untyped): untyped {.callsite.}- Оператор "больше". Это то же самое, что и
y < x. Исходный код Редактировать template `>%`(x, y: untyped): untyped
- Рассматривает
xиyкак беззнаковые и сравнивает их. Возвращает true, еслиunsigned(x) > unsigned(y). Исходный код Редактировать template `>=`(x, y: untyped): untyped {.callsite.}- Оператор "больше или равно". Это то же самое, что и
y <= x. Исходный код Редактировать template `>=%`(x, y: untyped): untyped
- Рассматривает
xиyкак беззнаковые и сравнивает их. Возвращает true, еслиunsigned(x) >= unsigned(y). Исходный код Редактировать template `[]`(s: string; i: int): char
- Исходный код Редактировать
template `[]=`(s: string; i: int; val: char)
- Исходный код Редактировать
template `^`(x: int): BackwardsIndex
-
Встроенный оператор roof, который можно использовать для удобного доступа к элементам массива.
a[^x]является сокращением дляa[a.len-x].let a = [1, 3, 5, 7, 9] b = "abcdefgh" echo a[^1] # => 9 echo b[^2] # => g
Исходный код Редактировать template alloc(size: Natural): pointer
-
Выделяет новый блок памяти с размером не менее
sizeбайт.Блок нужно освободить с помощью realloc(block, 0) или dealloc(block). Блок не инициализирован, поэтому чтение из него до записи в него — неопределённое поведение!
Выделенная память принадлежит потоку, который её выделил! Используйте allocShared для выделения из общей кучи.
См. также:
Исходный код Редактировать template alloc0(size: Natural): pointer
-
Выделяет новый блок памяти с размером не менее
sizeбайт.Блок нужно освободить с помощью realloc(block, 0) или dealloc(block). Блок инициализирован нулями, поэтому он несколько безопаснее, чем alloc.
Выделенная память принадлежит потоку, который её выделил! Используйте allocShared0 для выделения из общей кучи.
Исходный код Редактировать template closureScope(body: untyped): untyped
-
Полезно при создании замыкания в цикле для захвата локальных переменных цикла по значениям текущей итерации.
Примечание: Этот шаблон может не работать в некоторых случаях, используйте capture вместо этого.
Пример:
var myClosure : proc() # without closureScope: for i in 0 .. 5: let j = i if j == 3: myClosure = proc() = echo j myClosure() # outputs 5. `j` is changed after closure creation # with closureScope: for i in 0 .. 5: closureScope: # Everything in this scope is locked after closure creation let j = i if j == 3: myClosure = proc() = echo j myClosure() # outputs 3Исходный код Редактировать template currentSourcePath(): string
-
Возвращает полный путь к текущему исходному файлу в файловой системе.
Для получения каталога, содержащего текущий исходный код, используйте его с ospaths2.parentDir() как
currentSourcePath.parentDir().Путь, возвращаемый этим шаблоном, устанавливается во время компиляции.
См. строку документации для macros.getProjectPath(), чтобы увидеть разницу между
currentSourcePath()иgetProjectPath().См. также:
Исходный код Редактировать template disarm(x: typed)
- Полезно для
disarmingявных висячих указателей для--newruntime. Независимо от того, используется ли--newruntimeили нет, это устанавливает указатель или обратный вызовxвnil. Это экспериментальный API! Исходный код Редактировать template dumpAllocstats(code: untyped)
- Исходный код Редактировать
template excl[T](x: var set[T]; y: set[T]) {.callsite.}- Исключение множества
yиз множестваx.Пример:
var a = {1, 3, 5, 7} var b = {3, 4, 5} a.excl(b) assert a == {1, 7}Исходный код Редактировать
template formatErrorIndexBound[T](i, a, b: T): string
- Исходный код Редактировать
template formatErrorIndexBound[T](i, n: T): string
- Исходный код Редактировать
template formatFieldDefect(f, discVal): string
- Исходный код Редактировать
template `in`(x, y: untyped): untyped {.dirty, callsite.}-
Упрощение для
contains.assert(1 in (1..3) == true) assert(5 in (1..3) == false)
Исходный код Редактировать template incl[T](x: var set[T]; y: set[T]) {.callsite.}- Включает множество
yв множествоx.Пример:
var a = {1, 3, 5, 7} var b = {4, 5, 6} a.incl(b) assert a == {1, 3, 4, 5, 6, 7}Исходный код Редактировать template `isnot`(x, y: untyped): untyped {.callsite.}-
Отрицательная версия is. Эквивалентно
not(x is y).assert 42 isnot float assert @[1, 2] isnot enum
Исходный код Редактировать template likely(val: bool): bool
-
Подсказывает оптимизатору, что
val, вероятно, будет истинным.Вы можете использовать эту шаблонную функцию для оформления условия ветвления. На некоторых платформах это может помочь процессору лучше предсказать, какой ветвь будет выполнена. Пример:
for value in inputValues: if likely(value <= 100): process(value) else: echo "Value too big!"На платформах без предсказания ветвей (JS и виртуальная машина nimscript), этот шаблон не повлияет на выполнение кода.
Исходный код Редактировать template newException(exceptn: typedesc; message: string; parentException: ref Exception = nil): untyped- Создаёт объект исключения типа
exceptnи устанавливает полеmsgвmessage. Возвращает новый объект исключения. Исходный код Редактировать template nimThreadProcWrapperBody(closure: untyped): untyped
- Исходный код Редактировать
template `notin`(x, y: untyped): untyped {.dirty, callsite.}-
Упрощение для
not contains.assert(1 notin (1..3) == false) assert(5 notin (1..3) == true)
Исходный код Редактировать template offsetOf[T](t: typedesc[T]; member: untyped): int
- Исходный код Редактировать
template offsetOf[T](value: T; member: untyped): int
- Исходный код Редактировать
template once(body: untyped): untyped
-
Выполняет блок кода только один раз (в первый раз, когда блок достигается).
proc draw(t: Triangle) = once: graphicsInit() line(t.p1, t.p2) line(t.p2, t.p3) line(t.p3, t.p1)Исходный код Редактировать template rangeCheck(cond)
- Помощник для выполнения пользовательских проверок диапазона. Такие проверки будут выполняться только при включении компиляционной опции
rangechecks. Исходный код Редактировать template realloc(p: pointer; newSize: Natural): pointer
-
Увеличивает или уменьшает заданный блок памяти.
Если
pравно nil, то возвращается новый блок памяти. В любом случае блок имеет как минимумnewSizeбайт. ЕслиnewSize == 0иpне равны nil,reallocвызываетdealloc(p). В других случаях блок необходимо освободить с помощью dealloc(block).Выделенная память принадлежит потоку, который её выделил! Используйте reallocShared для выделения памяти из общей кучи.
Исходный код Редактировать template realloc0(p: pointer; oldSize, newSize: Natural): pointer
-
Увеличивает или уменьшает заданный блок памяти.
Если
pравно nil, то возвращается новый блок памяти. В любом случае блок имеет как минимумnewSizeбайт. ЕслиnewSize == 0иpне равны nil,reallocвызываетdealloc(p). В других случаях блок необходимо освободить с помощью dealloc(block).Блок инициализируется всеми байтами нулями, поэтому он несколько безопаснее, чем realloc
Выделенная память принадлежит потоку, который её выделил! Используйте reallocShared для выделения памяти из общей кучи.
Исходный код Редактировать template setupForeignThreadGc()
- При
--mm:arc— ничто. Исходный код Редактировать template tearDownForeignThreadGc()
- При
--mm:arc— ничто. Исходный код Редактировать template unlikely(val: bool): bool
-
Подсказывает оптимизатору, что
val, вероятно, будет ложным.Вы можете использовать эту функцию для оформления условия ветвления. На некоторых платформах это может помочь процессору лучше предсказать, какой ветвь будет выполнена. Пример:
for value in inputValues: if unlikely(value > 100): echo "Value too big!" else: process(value)На платформах без предсказания ветвей (JS и виртуальная машина nimscript), этот шаблон не повлияет на выполнение кода.
Исходный код Редактировать template unown(x: typed): untyped
- Исходный код Редактировать
© 2006–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/system.html