# Changelog ## Latest ## 4.1.0 ### New Features * Enabled user-defined infixes for expressions and patterns: * Allowed `let` expression to decompose data. Unlike `match` expressions (of Egison), this does not require matchers and the decomposition pattern is limited. ``` > let (x :: _) := [1, 2, 3] in x 1 > let (x :: _) := [] in x Primitive data pattern match failed stack trace: ``` * Enabled data decomposition at lambda arguments. ``` > (\(x, _) -> x) (1, 2) 1 ``` * Implemented partial application. ``` > let add x y := x + y in map (add 1) [1, 2, 3] [2, 3, 4] ``` * Huge speedup in mathematical programs: * Reimplemented math normalization, which was originally implemented in Egison, to the interpreter in Haskell. * Implemented lazy evaluation on tensor elements. * Added new syntax for symmetric / anti-symmetric tensors. ### Backward-incompatible Changes * Changed the syntax to start definitions with `def` keyword. ``` def x := 1 ``` * `io` was previously defined as a syntastic constructs, but it is changed into a primitive function. Namely, users will need to wrap the arguments to `io` in a parenthesis, or insert `$` after `io`. ``` -- Invalid io isEof () -- OK io (isEOF ()) io $ isEOF () ``` ### Miscellaneous * Added a command line option `--no-normalize` to turn off math normalization implemented in the standard math library. * Revived TSV input options: * Deprecated `redefine`. ## 4.0.3 * Renamed `f.pi` into `pi`. ## 4.0.1 * Fixed a bug of not-patterns inside sequential patterns. * Deprecated `procedure` (replace them with anonymous function) ## 4.0.0 * Enabled the Haskell-like new syntax by default.