std/sugar
Исходный код ИзменитьЭтот модуль реализует удобный синтаксический сахар, основанный на системе макросов Nim.
Импорты
- since, макросы, underscored_calls
Макросы
macro `->`(p, b: untyped): untyped
- Синтаксический сахар для типов процедур. Он также поддерживает директивы.Предупреждение: Точки с запятой нельзя использовать для разделения аргументов процедуры.
Пример:
proc passTwoAndTwo(f: (int, int) -> int): int = f(2, 2) # is the same as: # proc passTwoAndTwo(f: proc (x, y: int): int): int = f(2, 2) assert passTwoAndTwo((x, y) => x + y) == 4 proc passOne(f: (int {.noSideEffect.} -> int)): int = f(1) # is the same as: # proc passOne(f: proc (x: int): int {.noSideEffect.}): int = f(1) assert passOne(x {.noSideEffect.} => x + 1) == 2Исходный код Изменить macro `=>`(p, b: untyped): untyped
- Синтаксический сахар для анонимных процедур. Он также поддерживает директивы.Предупреждение: Точки с запятой нельзя использовать для разделения аргументов процедуры.
Пример:
proc passTwoAndTwo(f: (int, int) -> int): int = f(2, 2) assert passTwoAndTwo((x, y) => x + y) == 4 type Bot = object call: (string {.noSideEffect.} -> string) var myBot = Bot() myBot.call = (name: string) {.noSideEffect.} => "Hello " & name & ", I'm a bot." assert myBot.call("John") == "Hello John, I'm a bot." let f = () => (discard) # simplest proc that returns void f()Исходный код Изменить macro capture(locals: varargs[typed]; body: untyped): untyped
- Полезно при создании замыкания в цикле для захвата некоторых локальных переменных цикла по их текущим значениям итерации.
Пример:
import std/strformat var myClosure: () -> string for i in 5..7: for j in 7..9: if i * j == 42: capture i, j: myClosure = () => fmt"{i} * {j} = 42" assert myClosure() == "6 * 7 = 42"Исходный код Изменить macro collect(body: untyped): untyped
-
То же самое, что и
collect, но без параметраinit.См. также:
Пример:
import std/[sets, tables] let data = @["bird", "word"] # seq: let k = collect: for i, d in data.pairs: if i mod 2 == 0: d assert k == @["bird"] ## HashSet: let n = collect: for d in data.items: {d} assert n == data.toHashSet ## Table: let m = collect: for i, d in data.pairs: {i: d} assert m == {0: "bird", 1: "word"}.toTableИсходный код Изменить macro collect(init, body: untyped): untyped
-
Понимание для seqs/sets/tables.
Последнее выражение
bodyимеет специальный синтаксис, который указывает операцию добавления в коллекцию. Используйте{e}для добавления в set,{k: v}для добавления в table иeдля добавления в seq.Пример:
import std/[sets, tables] let data = @["bird", "word"] ## seq: let k = collect(newSeq): for i, d in data.pairs: if i mod 2 == 0: d assert k == @["bird"] ## seq with initialSize: let x = collect(newSeqOfCap(4)): for i, d in data.pairs: if i mod 2 == 0: d assert x == @["bird"] ## HashSet: let y = collect(initHashSet()): for d in data.items: {d} assert y == data.toHashSet ## Table: let z = collect(initTable(2)): for i, d in data.pairs: {i: d} assert z == {0: "bird", 1: "word"}.toTableИсходный код Изменить macro dump(x: untyped): untyped
-
Выводит содержимое выражения, полезно для отладки. Он принимает любое выражение и выводит текстовое представление дерева, представляющего выражение (как оно отобразилось бы в исходном коде), вместе со значением выражения.
См. также:
dumpToString, которое более удобно и полезно, так как оно раскрывает промежуточные шаблоны/макросы, возвращает строку вместо вызоваecho, и работает с операторами и выражениями.Пример: cmd: -r:off
let x = 10 y = 20 dump(x + y) # prints: `x + y = 30`
Исходный код Изменить macro dumpToString(x: untyped): string
- Возвращает содержимое оператора или выражения
xпосле семантического анализа, полезно для отладки.Пример:
const a = 1 let x = 10 assert dumpToString(a + 2) == "a + 2: 3 = 3" assert dumpToString(a + x) == "a + x: 1 + x = 11" template square(x): untyped = x * x assert dumpToString(square(x)) == "square(x): x * x = 100" assert not compiles dumpToString(1 + nonexistent) import std/strutils assert "failedAssertImpl" in dumpToString(assert true) # example with a statement
Исходный код Изменить macro dup[T](arg: T; calls: varargs[untyped]): T
-
Преобразует алгоритм in-place в алгоритм, работающий с копией, и возвращает эту копию, не изменяя входные данные.
Этот макрос также позволяет создавать цепочки функций (иначе in-place).
С версии: Версия 1.2.
Пример:
import std/algorithm let a = @[1, 2, 3, 4, 5, 6, 7, 8, 9] assert a.dup(sort) == sorted(a) # Chaining: var aCopy = a aCopy.insert(10) assert a.dup(insert(10), sort) == sorted(aCopy) let s1 = "abc" let s2 = "xyz" assert s1 & s2 == s1.dup(&= s2) # An underscore (_) can be used to denote the place of the argument you're passing: assert "".dup(addQuoted(_, "foo")) == "\"foo\"" # but `_` is optional here since the substitution is in 1st position: assert "".dup(addQuoted("foo")) == "\"foo\"" proc makePalindrome(s: var string) = for i in countdown(s.len-2, 0): s.add(s[i]) let c = "xyz" # chaining: let d = dup c: makePalindrome # xyzyx sort(_, SortOrder.Descending) # zyyxx makePalindrome # zyyxxxyyz assert d == "zyyxxxyyz"Исходный код Изменить
© 2006–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/sugar.html