# std/with

Theme:

- Manual
- Standard library
- Index
- Compiler docs
- Fusion docs
- devel, stable

Search:
Source Edit

This module implements the `with` macro for easy function chaining. See https://github.com/nim-lang/RFCs/issues/193 and https://github.com/nim-lang/RFCs/issues/192 for details leading to this particular design.

Since: version 1.2.

# Imports

macros, underscored_calls

# Macros

    macro with(arg: typed; calls: varargs[untyped]): untyped

  This macro provides chaining of function calls. It does so by patching every call in `calls` to use `arg` as the first argument.
  Caution: This evaluates `arg` multiple times!

  Example:

      var x = "yay"
      with x:
        add "abc"
        add "efg"
      doAssert x == "yayabcefg"

      var a = 44
      with a:
        += 4
        -= 5
      doAssert a == 43

      # Nesting works for object types too!
      var foo = (bar: 1, qux: (baz: 2))
      with foo:
        bar = 2
        with qux:
          baz = 3
      doAssert foo.bar == 2
      doAssert foo.qux.baz == 3

  Source Edit