****Nickel****
‣ [Nix](https://texonom.com/nix-587d7baff6ee4cd1a6ca1d4012835c76) 


Nickel is an evolution of the Nix language
```type$ ./nickel export --format json <<< '{foo = "Hello, world!"}'{  "foo": "Hello, world!"}```



- **Lightweight**: Nickel is easy to embed. An interpreter should be simple to implement. The reference interpreter can be called from many programming languages.
- **Composable code**: the basic building blocks for computing are functions. They are first-class citizens, which can be passed around, called and composed.
- **Composable data**: the basic building blocks for data are records (called *objects* in JSON). In Nickel, records can be merged at will, including associated metadata (documentation, default values, type contracts, etc).
- **Typed, but only when it helps**: static types improve code quality, serve as documentation and eliminate bugs early. But application-specific self-contained code will always evaluate to the same value, so type errors will show up at runtime anyway. Some JSON is hard to type. There, types are only a burden. Whereas reusable code - that is, *functions* - is evaluated on potentially infinitely many different inputs, and is impossible to test exhaustively. There, types are precious. Nickel has types, but you get to choose when you want it or not, and it handles safely the interaction between the typed and the untyped world.
- **Design by contract**: complementary to the type system, contracts are a principled approach to checking assertions. The interpreter automatically inserts assertions at the boundary between typed and untyped code. Nickel lets users add arbitrary assertions of their own and easily understand why when assertions fail.







