https://github.com/citycide/cascade
  
  
    Method, accessor, and assignment cascades for Nim, inspired by Smalltalk & Dart. 
    https://github.com/citycide/cascade
  
assignment-cascades cascade macro nim self this with
        Last synced: 3 months ago 
        JSON representation
    
Method, accessor, and assignment cascades for Nim, inspired by Smalltalk & Dart.
- Host: GitHub
 - URL: https://github.com/citycide/cascade
 - Owner: haltcase
 - License: mit
 - Created: 2017-11-11T20:46:05.000Z (almost 8 years ago)
 - Default Branch: master
 - Last Pushed: 2024-05-13T16:06:16.000Z (over 1 year ago)
 - Last Synced: 2025-07-28T18:09:21.203Z (3 months ago)
 - Topics: assignment-cascades, cascade, macro, nim, self, this, with
 - Language: Nim
 - Homepage:
 - Size: 12.7 KB
 - Stars: 102
 - Watchers: 4
 - Forks: 5
 - Open Issues: 2
 - 
            Metadata Files:
            
- Readme: readme.md
 - License: license
 
 
Awesome Lists containing this project
- awesome-nim - cascade - Method & assignment cascades for Nim, inspired by Smalltalk & Dart. (Language Features / Functional Programming)
 
README
          # cascade · [](https://nimble.directory/pkg/cascade) 
> Method & assignment cascades for Nim, inspired by Smalltalk & Dart.
cascade is a macro for Nim that implements _method cascades_, a feature
originally from Smalltalk that's made its way into modern languages like
[Dart][dart] and [Kotlin][kotlin].
It allows you to avoid repeating an object's name for each method call
or assignment. A common case is something like a button:
```nim
# before
var res = Button()
res.text = "ok"
res.width = 30
res.color = "#13a89e"
res.enable()
```
With cascade, you don't need to repeat yourself:
```nim
# after
let btn = cascade Button():
  text = "ok"
  width = 30
  color = "#13a89e"
  enable()
```
Also notice you can avoid declaring a `var` if you don't need to modify
the target object after the fact — the object is mutable within the
cascade block but becomes a `let` binding outside of that block.
## installation & usage
Install using [Nimble][nimble]:
```shell
nimble install cascade
```
Then `import` and use:
```nim
import cascade
let x = cascade y:
  z = 10
  f()
```
## supported constructs
* field assignment
  ```nim
  let foo = cascade Foo():
    bar = 100
  # ↑ equivalent ↓
  var foo = Foo()
  foo.bar = 100
  ```
* nested field assignment
  ```nim
  let foo = cascade Foo():
    bar.baz.qux = "awesome"
  # ↑ equivalent ↓
  var foo = Foo()
  foo.bar.baz.qux = "awesome"
  ```
* proc/template/method calls
  ```nim
  let foo = cascade Foo():
    fn("hello", "world")
  # ↑ equivalent ↓
  var foo = Foo()
  foo.fn("hello", "world")
  ```
* nested calls on fields
  ```nim
  let foo = cascade Foo():
    bar.baz.seqOfStrings.add "more awesome"
  # ↑ equivalent ↓
  var foo = Foo()
  foo.bar.baz.seqOfStrings.add "more awesome"
  ```
* `if` and `when` conditionals
  ```nim
  let foo = cascade Foo():
    if someCondition: bar.baz = 2
  # ↑ equivalent ↓
  var foo = Foo()
  if someCondition: foo.bar.baz = 2
  ```
* `cascade`s can be nested within each other
  ```nim
  let foo = cascade Foo():
    bar = cascade Bar():
      baz = cascade Baz():
        str = "we're down here now!"
  # ↑ equivalent ↓
  var foo = Foo()
  foo.bar = Bar()
  foo.bar.baz = Baz(str: "we're down here now!")
  ```
> Is something missing? Check the open [issues][issues] first or open a new
one. Pull requests are appreciated!
## building
To build cascade from source you'll need to have [Nim][nim] installed,
and should also have [Nimble][nimble], Nim's package manager.
1. Clone the repo: `git clone https://github.com/haltcase/cascade.git`
2. Move into the newly cloned directory: `cd cascade`
3. Make your changes: `cascade.nim`, `tests/tests.nim`
4. Run tests: `nimble test`
## contributing
You can check the [issues][issues] for anything unresolved, search for a
problem you're encountering, or open a new one. Pull requests for improvements
are also welcome.
## license
MIT © [Bo Lingen / haltcase](https://github.com/haltcase)
[dart]: https://dart.dev/language/operators#cascade-notation
[kotlin]: https://kotlinlang.org/docs/scope-functions.html#apply
[nim]: https://github.com/nim-lang/nim
[nimble]: https://github.com/nim-lang/nimble
[issues]: https://github.com/haltcase/cascade/issues