сахар
Этот модуль реализует приятный синтаксический сахар, основанный на системе макросов Nim.
Импорты
- since, макросы, подчёркнутые_вызовы, алгоритм, случайные, множества, таблицы, строковые_утилиты
Макросы
macro `=>`(p, b: untyped): untyped
- Синтаксический сахар для анонимных процедур. Он также поддерживает директивы.
Пример:
proc passTwoAndTwo(f: (int, int) -> int): int = f(2, 2) doAssert passTwoAndTwo((x, y) => x + y) == 4 type Bot = object call: proc (): string {.nosideEffect.} var myBot = Bot() myBot.call = () {.nosideEffect.} => "I'm a bot." doAssert myBot.call() == "I'm a bot."Исходный код Редактировать macro `->`(p, b: untyped): untyped
- Синтаксический сахар для типов процедур.
proc pass2(f: (float, float) -> float): float = f(2, 2) # is the same as: proc pass2(f: proc (x, y: float): float): float = f(2, 2)
Исходный код Редактировать macro dump(x: untyped): untyped
-
Выводит содержимое выражения, полезно для отладки. Он принимает любое выражение и печатает текстовое представление дерева, представляющего выражение — как оно появилось бы в исходном коде — вместе со значением выражения.
Например,
let x = 10 y = 20 dump(x + y)
выведет
Исходный код Редактироватьx + y = 30. macro capture(locals: varargs[typed]; body: untyped): untyped
- Полезно при создании замыкания в цикле для захвата некоторых локальных переменных цикла по их текущим значениям итерации. Пример:
import strformat, sequtils, sugar var myClosure : proc() for i in 5..7: for j in 7..9: if i * j == 42: capture i, j: myClosure = proc () = echo fmt"{i} * {j} = 42" myClosure() # output: 6 * 7 == 42 let m = @[proc (s: string): string = "to " & s, proc (s: string): string = "not to " & s] var l = m.mapIt(capture(it, proc (s: string): string = it(s))) let r = l.mapIt(it("be")) echo r[0] & ", or " & r[1] # output: to be, or not to beИсходный код Редактировать macro dup[T](arg: T; calls: varargs[untyped]): T
-
Преобразует алгоритм in-place в алгоритм, работающий с копией и возвращающий эту копию, не изменяя входные данные.
Этот макрос также позволяет (в противном случае in-place) цепочку функций.
С версии: Версия 1.2.
Пример:
import algorithm var a = @[1, 2, 3, 4, 5, 6, 7, 8, 9] doAssert a.dup(sort) == sorted(a) # Chaining: var aCopy = a aCopy.insert(10) doAssert a.dup(insert(10), sort) == sorted(aCopy) var s1 = "abc" var s2 = "xyz" doAssert s1 & s2 == s1.dup(&= s2) proc makePalindrome(s: var string) = for i in countdown(s.len-2, 0): s.add(s[i]) var c = "xyz" # An underscore (_) can be used to denote the place of the argument you're passing: doAssert "".dup(addQuoted(_, "foo")) == "\"foo\"" # but `_` is optional here since the substitution is in 1st position: doAssert "".dup(addQuoted("foo")) == "\"foo\"" # chaining: # b = "xyz" var d = dup c: makePalindrome # xyzyx sort(_, SortOrder.Descending) # zyyxx makePalindrome # zyyxxxyyz doAssert d == "zyyxxxyyz"Исходный код Редактировать macro collect(init, body: untyped): untyped
-
Понимание для коллекций seq/set/table.
init— вызов инициализации, и поэтому поддерживаются пользовательские коллекции.Последнее утверждение
bodyимеет специальный синтаксис, который определяет операцию добавления в коллекцию. Используйте{e}для добавления в множествоincl,{k: v}для добавления в таблицу[]=иeдля добавления в последовательностьadd.Процедура
initможет вызываться с любым количеством аргументов, т.е.initTable(initialSize).Пример:
import 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 = initHashSet.collect: 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Исходный код Редактировать
© 2006–2021 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/sugar.html