You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
with is fun, but as its own project it should have a splash image like "Inspired by a forbidden(TM) JavaScript feature!"
-jrfondren
with is a simple macro to replace the deprecated {.with.} pragma in Nim.
This macro allow you to access fields of an object or tuple without having to
repeatedly type its name. It works by creating tiny templates with the same
name as the field that expand to access to the field in the object.
Example:
type Foo =refobject
first: int
second: string
third: floatvar foo = Foo(first: 1, second: "two", third: 3.0)
with foo:
echo first
iftrue:
third =float(first)
echo second
with also works with named tuples:
var foo = (first: 1, second: "two")
with foo:
first =3
second ="six"
Fields from the object can be shadowed by new declarations in the scope where
the new declaration is made. The object field can still be accessed by using its
full dot-expression notation:
var foo = (first: 1, second: "two")
with foo:
assert first ==1iftrue:
let first ="dragons"
assert first =="dragons"
assert foo.first ==1
assert first ==1
assert foo.first ==1
For the brave, with blocks can be nested, or multiple objects can be passed
in a tuple constructor. Make sure that field names are unique in the nested
objects:
var foo = (first: 1, second: "two")
var bar = (alpha: 42)
with foo:
with bar:
first = alpha
with (foo,bar):
first = alpha