Skip to content

Releases: tweag/nickel

1.6.0

25 Apr 07:53
3441781
Compare
Choose a tag to compare

Version 1.6 (2024-04-25)

Nickel 1.6 is a maintenance release including several bug fixes and improvements, in particular around the features introduced in Nickel 1.5 (enum variants and background evaluation in the LSP).

Core language

Stdlib

Documentation

  • modular-configurations.md: to_lower -> lowercase by @Jasha10 in #1857
  • manual/modular-configurations.md: add argument to std.string.join by @Jasha10 in #1859
  • manual/syntax.md: minor typo by @Jasha10 in #1860

LSP

  • Improve diagnostic location in nls by @jneem in #1856
  • Propagate pending array contracts in permissive_eval by @jneem in #1854
  • Don't leak memory in background eval by @jneem in #1869
  • Add a recursion limit to background evaluation by @jneem in #1878
  • Dedup diagnostics by @jneem in #1883
  • Extend the symbol range to include the rhs by @jneem in #1887
  • Leverage function contract information by @yannham in #1888
  • Fix LSP not showing type signature in untyped code by @yannham in #1889

Tooling

  • Markdown documentation generation: do not insert line breaks by @yannham in #1879
  • [Fix] Nickel doc: fix missing newline in markdown output by @yannham in #1880
  • Fix infinite recursion in doc symbols. by @jneem in #1881

Fixes

New Contributors

Full Changelog: 1.5.0...1.6.0

1.5.0

12 Mar 18:52
13ffc85
Compare
Choose a tag to compare

Nickel 1.5 is a major release (albeit not literally), with new core language features and improved LSP. In particular, Nickel 1.5 introduces:

  • Full blown pattern matching. Patterns were previously restricted to destructuring let-bindings. They can now be used within match expressions as well (which only supported simple enum tags before).
  • Enum variants. Enum variants are a new language construct. Enum variants are enum tags with associated data (they are applied to an argument). They can be seen as form of algebraic data types (ADT). Patterns, enum types, typechecking and other parts of the language are extended accordingly to support them.
  • Background evaluation in the LSP. The LSP now performs evaluation of the current document in the background to report evaluation errors directly in your editor, and in particular contract errors.
  • A new section of the manual on writing modular configurations.

Please refer to the manual for more details on those new features.

Core language

Stdlib

  • Add array.zip_with and array.map_with_index to the standard library by @vkleen in #1797
  • fixed std.array.split_at behavior at right boundary. by @suimong in #1803
  • Update stdlib for ADTs by @yannham in #1822

Tooling

Documentation

  • Add patterns to the syntax section of the manual by @yannham in #1832
  • Improve the description of identifier syntax in the manual by @vkleen in #1839
  • Add subsection on enum types in the manual by @yannham in #1836
  • Fix old CLI syntax in documentation by @cydparser in #1844
  • Add manual section on modular configurations by @yannham in #1841
  • Update/refresh examples using latest Nickel idioms by @yannham in #1849

Fixes

New Contributors

Full Changelog: 1.4.1...1.5.0

1.4.1

25 Jan 19:22
25ea79e
Compare
Choose a tag to compare

This patch release fixes a bug that could lead the contract attached to a field to be silently ignored when extracting this field with the --field CLI argument introduced in 1.3.0. See #1774.

1.4.0

10 Jan 17:57
1fa5a79
Compare
Choose a tag to compare

Version 1.4

Nickel 1.4 is a maintenance release, at the exception of a breaking change (see below).

Breaking changes

  • The curried dot operator added in Nickel 1.3 was implemented the wrong way: the arguments were flipped, meaning that (.) foo bar was bar."%{foo}" instead of the expected foo."%{bar}". While the initial flipped implementation seems more useful for piping operations using the reverse application operator |>, it's inconsistent with all other curried operators, where (<operator>) is always defined as fun x y => x <operator> y. To ensure consistency, and because the initial behavior was an oversight and not a conscious design decision, we decided to change the definition of (.) to match the other curried operator by flipping its arguments.

    To fill the gap, Nickel 1.4 introduces std.record.get with the same definition as the (.) introduced in Nickel 1.3. To migrate from 1.3 to 1.4, you can either flip the arguments of the curried dot as a function (.) whenever possible, or you can just replace it with the new std.record.get.

    (implemented by @yannham in #1752)

Tooling

  • Search for imports in NICKEL_IMPORT_PATH by @jneem in #1716
  • Add a cli param --import-path to specify the search path by @jneem in #1721
  • LSP: Fix hover on assignments to subrecords by @jneem in #1725
  • Print something when nickel doc succeeds by @yannham in #1729
  • Add --error-format flag to serialize err diagnostics by @yannham in #1740

Core language

Fixes

  • format: don't fail silently on invalid input anymore by @yannham in #1749
  • LSP: get record completion in arrays by @jneem in #1746
  • Update Topiary dependencies to handle (.) in nickel format by @yannham in #1753

New Contributors

Full Changelog: 1.3.0...1.4.0

1.3.0

16 Nov 17:01
4798c4d
Compare
Choose a tag to compare

Version 1.3

Version 1.3 includes several new optimizations following reports of long evaluation time for medium-sized codebase. The command-line interface (CLI) has been reworked to be more user-friendly, at the cost of breaking changes: see below. Finally, the LSP has seen continuous improvement as well.

Breaking changes

  • @vkleen improved the CLI UX in numerous ways in #1632

    • The file argument is now argument positional. That is, instead of running nickel export -f config.ncl, now use nickel export config.ncl instead.
    • Every command which can take a file argument can now take several of them. The program parsed from the files are then merged before applying the action. For example, the new nickel export config1.ncl config2.ncl config3.ncl is the equivalent of the previous nickel export <<< '(import "config1.ncl") & (import "config2.ncl") & (import "config3.ncl")'
    • Evaluation is now an explicit subcommand, instead of being the default action. Instead of running nickel -f config.ncl to evaluate a file, use nickel eval config.ncl instead.
  • Not a breaking change per se, because the customize mode is experimental, but @yannham introduced a new syntax for customize mode in #1709. Instead of dynamically generating a CLI where arguments are field paths, the new customize mode CLI directly take assignments written in a Nickel-like syntax as positional arguments. For example, in 1.2, the command:

    $ nickel eval -f confing.ncl -- \
      --input.field1 '"Value"' --input.flag false \
      --override output.bar 0`

    now becomes

    $ nickel eval config.ncl -- \
      'input.field1="Value"' input.flag=false \
      --override output.bar=0`

Fixes

  • Fix record.update by making record.insert act consistently by @yannham in #1669

Tooling

  • LSP:
    • implement type-based completion in the new completer by @jneem in #1577
    • Improve context completion by @jneem in #1584
    • Take the ancestor path into account when env-completing from uncles. by @jneem in #1661
    • Add goto support for pattern bindings by @jneem in #1665
    • Add cousin search to goto and hover by @jneem in #1670
    • Improve hover output for let patterns by @jneem in #1696
    • First prototype of contract evaluation by @jneem in #1672
  • LSP: a large refactoring work by @jneem to get rid of the old and
    hard-to-maintain code analysis implementation
    (#1623,
    #1629,
    #1658,
    #1663)
  • Honor nostdlib in customize mode as well by @vkleen in #1634
  • Add the list subcommand to the customize mode by @yannham in #1709
  • add %eval_nix% primop for Nix interop by @Radvendii in
    #1465 (requires to build with the
    corresponding experimental feature enabled)
  • Get rid of shallow_repr and print full terms in error messages by @yannham in
    #1676
  • Add suggestions to the error message when misspelling a record field by @yannham in #1710
  • Add a --field argument to subcommands to target a specific field whenever it makes sense by @yannham in #1712

Optimizations

Documentation

  • Fix invalid example code in doc of blame_with_message by @bgni in #1689
  • Fix doc, example code for pipe lacks prefix by @bgni in #1692
  • change nickel-nix to organist by @Radvendii in #1691

New Contributors

Full Changelog: 1.2.2...1.3.0

1.2.2

29 Sep 12:11
fe2956b
Compare
Choose a tag to compare

This release contains a fix for code signing on MacOS in the nix build. All other installation methods (cargo and docker) are unchanged.

1.2.1

15 Sep 09:13
90180de
Compare
Choose a tag to compare

Fix the installation from crates.io via cargo install. This version is identical to 1.2.0 for any other installation method (Nix, cargo from source, etc.).

1.2.0

14 Sep 17:40
104881b
Compare
Choose a tag to compare

Version 1.2

Version 1.2 comes with several improvements on the LSP and other components of the Nickel tooling. The new customize mode of the CLI makes it possible to dynamically turn a configuration into a command-line interface, which you can interact with.

Several related long-standing issues and limitations when typechecking polymorphic functions are also finally fixed.

Core language

  • Make the lexer accept scientific notation by @vkleen in #1456
  • Improve polymorphism handling, bidirectional typechecking and fix unsound generalization by @yannham in #1372
  • Error on serializing very large numbers by @vkleen in #1470
  • Import YAML files containing multiple documents as arrays by @vkleen in #1497
  • Normalize line endings in string literals during parsing (Windows compatiblity) by @vkleen in #1562
  • Implement curried dot operator by @suimong in #1578
  • Statically merge partial record definitions by @vkleen in #1599
  • Disable recursive priorities by @yannham in #1600

Fixes

Tooling

  • Full vscode extension by @szlend and @yannham in (#1405, #1413, #1416)
  • Invalidate importers in NLS (plus a couple other import-related issues) by @jneem in #1426
  • Improve nickel query (and :query in the REPL) interface by @yannham in
    #1447
  • Topiary integration (formatting) as nickel format by @vkleen in #1371
  • LSP: various improvements to completion by @jneem (#1450, #1473)
  • Improve doc extraction capabilities through nickel doc (evaluate terms before extracting documentation) by @vkleen in #1463
  • LSP Fix persistent diagnostics by @jneem in #1478
  • Restore --version for CLI, include git revision by @yannham in #1486
  • Disable the colors when stdout isn't a tty by @thufschmitt in #1508
  • Improve type variables name allocation when reporting type errors by @yannham in #1512
  • LSP formatting without calling the topiary binary by @vkleen in #1526
  • LSP Initial handling of incomplete input by @jneem in #1541
  • LSP resolve imports for incomplete inputs also by @jneem in #1542
  • Add multiline string support for VSCode autoclosing pairs by @deotimedev in #1553
  • Display icon for nickel file in vscode explorer by @suimong in #1556
  • New experimental customize mode CLI to interact with a configuration on the
    command line (see nickel help export) by @Radvendii and @yannham in
    #1475
  • (LSP) Import completion by @deotimedev in #1561
  • Get rid of uninformative generic notes for higher-order contract errors by @yannham in #1564
  • Render hover documentation as Markdown in LSP by @deotimedev in #1559
  • Exit with nonzero exit code on failure by @vkleen in #1576

Stdlib

Documentation

  • manual docs: fix mismatch between input command and its echo in the output by @foo-jin in #1421
  • Add two examples: imports and foreach pattern by @mipmip in #1387
  • Fix some leftover instances of the old enum syntax in the manual by @vkleen in #1548

New Contributors

Full Changelog: 1.1.1...1.2.0

1.1.1

10 Jul 13:05
ee79605
Compare
Choose a tag to compare

This version mostly includes bugfixes and stdlib improvement since 1.0. 1.1.0 has been immediately followed by 1.1.1, because of a missing README issue on the new nickel-lang-cli crate published to crates.io. Because crates on crates.io are immutable, we had to bump the minor version.

IMPORTANT: The main crate nickel-lang has been split between nickel-lang-cli (the binary) and nickel-lang-core (the library). If you're using cargo to install Nickel, please uninstall the previous crate by running cargo uninstall nickel-lang, and from now one use cargo install nickel-lang-cli to install 1.1 and do further updates.

Stdlib

  • Encode more pre-conditions of stdlib functions as additional contracts,
    replacing dynamic type errors with nice contract errors by @yannham in #1358
  • ArraySliceFun incorrectly excluded the length of the array as the end index by @vkleen in #1396

Tooling

  • Improve the pretty printing of terms in the CLI and within error messages @vkleen in #1262
  • Fix LSP panic when importing JSON by @yannham in #1382
  • Fix LSP hanging under certain conditions involving external imports by @yannham in #1390
  • Better error message when contract makes certain rows illegal by @Radvendii in #1323
  • Fix function params hovering in the LSP by @yannham in #1395
  • Fix LSP infinite loop on hovering on external imports by @yannham in #1397

Fixes

  • Fixes incorrect variable names in type mismatch errors by @vkleen in #1313
  • Improve error messages for polymorphic tail parametricity violations by @matthew-healy in #1320
  • Fix panic on duplicated top-level idents in record destructuring by @matthew-healy in #1324
  • Prevent panic when parsing record type with field path by @matthew-healy in #1325
  • Give a better error message when trying to query a non-record by @jneem in #1326
  • Fix error position by @jneem in #1333
  • Fix panic when interpolating fields in a record type by @jneem in #1332
  • Fix type annotations not generating contracts by @yannham in #1379
  • Fix typechecker looping by adding missing check for unifying equal type vars by @yannham in #1400
  • Fix panic on function contract failure (position of arrow functions not set) by @yannham in #1407

1.0.0

17 May 12:01
da66771
Compare
Choose a tag to compare

Version 1.0

This is the 1.0 release! The syntax and the semantics of the core language have
been stabilized and shouldn't evolve as much in the future.

  • The core semantics of the language have been reworked and stabilized, in
    particular (but not limited to) merging, types and contracts with the
    implementation of RFC005
  • The stdlib has been augmented with many new functions
  • Parts of the syntax and some builtin symobls (types, stdlib functions, and so
    on) have been improved and made consistent
  • New features for the LSP, and in particular code completion

Breaking changes

  • Various functions from the stdlib have been renamed for better discoverability,
    and the stdlib got a lot of new additions. Please refer to the documentation
    of the stdlib.
  • String functions are now unicode-aware, and operate on the Unicode grapheme
    cluster abstraction instead of the character abstraction (string.length,
    string.is_match, etc.)
  • The switch keyword has been replaced by match, and can now be used as a
    standalone function (doesn't need to be applied right away)
  • The Num and Str builtin types have been renamed to Number and String by @yannham in #1164
  • The num and str stdlib modules have been renamed to number and string
  • The builtin.typeof function now returns 'Number, 'String, 'Function
    instead of respectively 'Num, 'Str, and 'Fun
  • The builtin.is_num, builtin.is_str and builtin.to_str functions have been
    renamed to is_number, is_string and to_string
  • The string.to_num and string.from_num functions have been renamed to
    to_number and from_number
  • All the stdlib modules array, string, record, etc. have been put
    under a std namespace. They must now be accessed as std.array,
    std.string and so on.
  • RFC005 was implemented, which changes the semantics of contract annotations
    and merging. See the RFC
    content

    for more details. Most notably, metadata annotation (default values,
    optional, documentation, etc.) can only appear next to a record field.
    Contract and type annotations can still appear anywhere. Documentation can
    still appear on let-bindings.
  • Use static dictionary types for record.fields and record.values by @matthew-healy in #1024
  • Make type annotations to not propagate through merging by @yannham in #1271
  • Change to dictionary contracts and introduction of a separate dictionary contract (in addition to dictionary type):
  • Stdlib string.Stringingable -> string.Stringable by @vkleen in #1180
  • Fix the type of array.elem by @yannham in #1223
  • Change the enum tag start delimiter from backtick to single-quote by @vkleen in #1279
  • import is now a statement, import "foo.ncl" arg1 arg2 requires parenthesis now: (import "foo.ncl") arg1 arg2, see #1293

Language features

  • Symbolic strings by @matthew-healy in #994
  • [RFC005] Lazy propagation by @yannham in #1086
  • Non-exported record fields by @vkleen in #1132
  • Enrich label custom reporting data by @yannham in #1152
  • Use type annotations in record patterns during typechecking by @matthew-healy in #1176
  • Use arbitrary precision rationals as the underlying representation of numbers by @yannham in #1182
  • Allow equal arrays to be merged in order to make merge idempotent by @yannham in #1229
  • Use deterministic hashtables, making runtime errors and typechecking error deterministic by @yannham in #1235

Stdlib

  • Add a %trace% primop (and std.trace function) by @vkleen in #1055
  • Add std.contract.Equal contract to the stdlib by @yannham in #1203

Tooling

  • Display meta information when providing completion in #966
  • LSP completion for import terms by @ebresafegaga in #993
  • Fix LSP server not giving completion when a non-contract meta-information is present in a declaration by @ebresafegaga in #991
  • Fix LSP not giving completion when an identifier is prefixed by a delimiting character by @ebresafegaga in #1043
  • Improve the "goto definition" feature of the LSP by making it work across multiple files by @ebresafegaga in #1029
  • Add --color option to the CLI by @matthew-healy in #1033
  • Make the "find references" feature of the LSP work across multiple files by @ebresafegaga in #1037
  • Add support for LSP completion using the surrounding context by @ebresafegaga (context completion) in #1057
  • Support completion for field names inside recursive records. by @ebresafegaga in #1088
  • Improve contract violation error reporting by @ebresafegaga in #1139
  • Add a JSON documentation export option by @vkleen in #1209
  • Add support for formatting capabilities to the LSP by @ebresafegaga in #1216