std/macrocache
Source EditЭтот модуль предоставляет API для макросов, позволяющий собирать информацию во время компиляции по границам модулей. Его следует использовать вместо глобальных {.compileTime.} переменных, так как они нарушают инкрементальную компиляцию.
Основная функция этого модуля заключается в том, что если вы создаёте CacheTable или любые другие Cache типы с одинаковым именем в разных модулях, их содержимое будет совместно использоваться. Это означает, что вы можете заполнить CacheTable в одном модуле и перебрать его содержимое в другом.
Пример:
import std/macrocache
import std/macros
const mcTable = CacheTable"myTable"
const mcSeq = CacheSeq"mySeq"
const mcCounter = CacheCounter"myCounter"
static:
# add new key "val" with the value `myval`
let myval = newLit("hello ic")
mcTable["val"] = myval
assert mcTable["val"].kind == nnkStrLit
# Can access the same cache from different static contexts
# All the information is retained
static:
# get value from `mcTable` and add it to `mcSeq`
mcSeq.add(mcTable["val"])
assert mcSeq.len == 1
static:
assert mcSeq[0].strVal == "hello ic"
# increase `mcCounter` by 3
mcCounter.inc(3)
assert mcCounter.value == 3 Типы
Процедуры
proc `[]`(s: CacheSeq; i: BackwardsIndex): NimNode {....raises: [], tags: [], forbids: [].}- Возвращает
i-й последний элемент изs.Пример:
import std/macros const mySeq = CacheSeq"backTest" static: mySeq &= newLit(42) mySeq &= newLit(7) assert mySeq[^1].intVal == 7 # Last item assert mySeq[^2].intVal == 42 # Second last item
Source Edit proc `[]`(s: CacheSeq; i: int): NimNode {.magic: "NcsAt", ...raises: [], tags: [], forbids: [].}- Возвращает
i-й элемент изs.Пример:
import std/macros const mySeq = CacheSeq"subTest" static: mySeq.add(newLit(42)) assert mySeq[0].intVal == 42
Source Edit proc `[]`(t: CacheTable; key: string): NimNode {.magic: "NctGet", ...raises: [], tags: [], forbids: [].}- Извлекает значение
NimNodeпо ключуt[key].Пример:
import std/macros const mcTable = CacheTable"subTest" static: mcTable["toAdd"] = newStmtList() # get the NimNode back assert mcTable["toAdd"].kind == nnkStmtList
Source Edit proc `[]=`(t: CacheTable; key: string; value: NimNode) {.magic: "NctPut", ...raises: [], tags: [], forbids: [].}- Вставляет пару
(key, value)вt.Предупреждение:keyдолжен быть уникальным! Присваиваниеvalueуже существующему ключуkeyв таблице приведёт к ошибке компилятора.Пример:
import std/macros const mcTable = CacheTable"subTest" static: # assign newLit(5) to the key "value" mcTable["value"] = newLit(5) # check that we can get the value back assert mcTable["value"].kind == nnkIntLit
Source Edit proc add(s: CacheSeq; value: NimNode) {.magic: "NcsAdd", ...raises: [], tags: [], forbids: [].}- Добавляет
valueвs.Пример:
import std/macros const mySeq = CacheSeq"addTest" static: mySeq.add(newLit(5)) mySeq.add(newLit("hello ic")) assert mySeq.len == 2 assert mySeq[1].strVal == "hello ic"Source Edit proc contains(t: CacheTable; key: string): bool {.inline, ...raises: [], tags: [], forbids: [].}- Псевдоним для hasKey для использования с оператором
in.Пример:
import std/macros const mcTable = CacheTable"containsEx" static: mcTable["foo"] = newEmptyNode() # Will be true since we gave it a value before assert "foo" in mcTable
Source Edit proc hasKey(t: CacheTable; key: string): bool {....raises: [], tags: [], forbids: [].}-
Возвращает true, если
keyесть в таблицеt.См. также:
-
процедуру contains для использования с оператором
in
Пример:
import std/macros const mcTable = CacheTable"hasKeyEx" static: assert not mcTable.hasKey("foo") mcTable["foo"] = newEmptyNode() # Will now be true since we inserted a value assert mcTable.hasKey("foo")Source Edit -
процедуру contains для использования с оператором
proc incl(s: CacheSeq; value: NimNode) {.magic: "NcsIncl", ...raises: [], tags: [], forbids: [].}- Добавляет
valueвs.Подсказка: Это ничего не делает, еслиvalueуже присутствует вs.Пример:
import std/macros const mySeq = CacheSeq"inclTest" static: mySeq.incl(newLit(5)) mySeq.incl(newLit(5)) # still one element assert mySeq.len == 1
Source Edit
Итераторы
iterator items(s: CacheSeq): NimNode {....raises: [], tags: [], forbids: [].}- Перебирает каждый элемент в
s.Пример:
import std/macros const myseq = CacheSeq"itemsTest" static: myseq.add(newLit(5)) myseq.add(newLit(42)) for val in myseq: # check that all values in `myseq` are int literals assert val.kind == nnkIntLitSource Edit iterator pairs(t: CacheTable): (string, NimNode) {....raises: [], tags: [], forbids: [].}- Перебирает все пары
(key, value)вt.Пример:
import std/macros const mytabl = CacheTable"values" static: mytabl["intVal"] = newLit(5) mytabl["otherVal"] = newLit(6) for key, val in mytabl: # make sure that we actually get the same keys assert key in ["intVal", "otherVal"] # all vals are int literals assert val.kind == nnkIntLitSource Edit
© 2006–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/macrocache.html