1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184
|
Release notes for Agda version 2.5.2
====================================
Installation and infrastructure
-------------------------------
* Modular support for literate programming
Literate programming support has been moved out of the lexer and into the
`Agda.Syntax.Parser.Literate` module.
Files ending in `.lagda` are still interpreted as literate TeX.
The extension `.lagda.tex` may now also be used for literate TeX files.
Support for more literate code formats and extensions can be added
modularly.
By default, `.lagda.*` files are opened in the Emacs mode
corresponding to their last extension. One may switch to and from
Agda mode manually.
* reStructuredText
Literate Agda code can now be written in reStructuredText format, using
the `.lagda.rst` extension.
As a general rule, Agda will parse code following a line ending in `::`,
as long as that line does not start with `..`. The module name must
match the path of the file in the documentation, and must be given
explicitly. Several files have been converted already, for instance:
- `language/mixfix-operators.lagda.rst`
- `tools/compilers.lagda.rst`
Note that:
- Code blocks inside an rST comment block will be type-checked by Agda,
but not rendered in the documentation.
- Code blocks delimited by `.. code-block:: agda` will be rendered in
the final documenation, but not type-checked by Agda.
- All lines inside a codeblock must be further indented than the first line
of the code block.
- Indentation must be consistent between code blocks. In other
words, the file as a whole must be a valid Agda file if all the
literate text is replaced by white space.
* Documentation testing
All documentation files in the `doc/user-manual` directory that end
in `.lagda.rst` can be typechecked by running `make
user-manual-test`, and also as part of the general test suite.
* Support installation through Stack
The Agda sources now also include a configuration for the stack install tool
(tested through continuous integration).
It should hence be possible to repeatably build any future Agda version
(including unreleased commits) from source by checking out that version and
running `stack install` from the checkout directory.
By using repeatable builds, this should keep selecting the same dependencies
in the face of new releases on Hackage.
For further motivation, see
Issue [#2005](https://github.com/agda/agda/issues/2005).
* Removed the `--test` command-line option
This option ran the internal test-suite. This test-suite was
implemented using Cabal supports for
test-suites. [Issue [#2083](https://github.com/agda/agda/issues/2083)].
* The `--no-default-libraries` flag has been split into two flags
[Issue [#1937](https://github.com/agda/agda/issues/1937)]
- `--no-default-libraries`: Ignore the defaults file but still look for local
`.agda-lib` files
- `--no-libraries`: Don't use any `.agda-lib` files (the previous behaviour
of `--no-default-libraries`).
* If `agda` was built inside `git` repository, then the `--version` flag
will display the hash of the commit used, and whether the tree was
`-dirty` (i.e. there were uncommited changes in the working directory).
Otherwise, only the version number is shown.
Language
--------
* Dot patterns are now optional
Consider the following program
```agda
data Vec (A : Set) : Nat → Set where
[] : Vec A zero
cons : ∀ n → A → Vec A n → Vec A (suc n)
vmap : ∀ {A B} n → (A → B) → Vec A n → Vec B n
vmap .zero f [] = []
vmap .(suc m) f (cons m x xs) = cons m (f x) (vmap m f xs)
```
If we don't care about the dot patterns they can (and could previously) be
replaced by wildcards:
```agda
vmap : ∀ {A B} n → (A → B) → Vec A n → Vec B n
vmap _ f [] = []
vmap _ f (cons m x xs) = cons m (f x) (vmap m f xs)
```
Now it is also allowed to give a variable pattern in place of the dot
pattern. In this case the variable will be bound to the value of the dot
pattern. For our example:
```agda
vmap : ∀ {A B} n → (A → B) → Vec A n → Vec B n
vmap n f [] = []
vmap n f (cons m x xs) = cons m (f x) (vmap m f xs)
```
In the first clause `n` reduces to `zero` and in the second clause
`n` reduces to `suc m`.
* Module parameters can now be refined by pattern matching
Previously, pattern matches that would refine a variable outside the
current left-hand side was disallowed. For instance, the following
would give an error, since matching on the vector would
instantiate `n`.
```agda
module _ {A : Set} {n : Nat} where
f : Vec A n → Vec A n
f [] = []
f (x ∷ xs) = x ∷ xs
```
Now this is no longer disallowed. Instead `n` is bound to the
appropriate value in each clause.
* With-abstraction now abstracts also in module parameters
The change that allows pattern matching to refine module parameters also
allows with-abstraction to abstract in them. For instance,
```agda
module _ (n : Nat) (xs : Vec Nat (n + n)) where
f : Nat
f with n + n
f | nn = ? -- xs : Vec Nat nn
```
Note: Any function argument or lambda-bound variable bound outside a given
function counts as a module parameter.
To prevent abstraction in a parameter you can hide it inside a definition. In
the above example,
```agda
module _ (n : Nat) (xs : Vec Nat (n + n)) where
ys : Vec Nat (n + n)
ys = xs
f : Nat
f with n + n
f | nn = ? -- xs : Vec Nat nn, ys : Vec Nat (n + n)
```
* As-patterns [Issue [#78](https://github.com/agda/agda/issues/78)].
As-patterns (`@`-patterns) are finally working and can be used to name a
pattern. The name has the same scope as normal pattern variables (i.e. the
right-hand side, where clause, and dot patterns). The name reduces to the
value of the named pattern. For example::
```agda
module _ {A : Set} (_<_ : A → A → Bool) where
merge : List A → List A → List A
merge xs [] = xs
merge [] ys = ys
merge xs@(x ∷ xs₁) ys@(y ∷ ys₁) =
if x < y then x ∷ merge xs₁ ys
else y ∷ merge xs ys₁
```
* Idiom brackets.
There is new syntactic sugar for idiom brackets:
`(| e a1 .. an |)` expands to
`pure e <*> a1 <*> .. <*> an`
The desugaring takes place before scope checking and only requires names
`pure` and `_<*>_` in scope. Idiom brackets work well with operators, for
instance
`(| if a then b else c |)` desugars to
`pure if_then_else_ <*> a <*> b <*> c`
Limitations:
- The top-level application inside idiom brackets cannot include
implicit applications, so `(| foo {x = e} a b |)` is illegal. In
the case `e` is pure you can write `(| (foo {x = e}) a b |)`
which desugars to
`pure (foo {x = e}) <*> a <*> b`
- Binding syntax and operator sections cannot appear immediately inside
idiom brackets.
* Layout for pattern matching lambdas.
You can now write pattern matching lambdas using the syntax
```agda
λ where false → true
true → false
```
avoiding the need for explicit curly braces and semicolons.
* Overloaded projections
[Issue [#1944](https://github.com/agda/agda/issues/1944)].
Ambiguous projections are no longer a scope error. Instead they get
resolved based on the type of the record value they are
eliminating. This corresponds to constructors, which can be
overloaded and get disambiguated based on the type they are
introducing. Example:
```agda
module _ (A : Set) (a : A) where
record R B : Set where
field f : B
open R public
record S B : Set where
field f : B
open S public
```
Exporting `f` twice from both `R` and `S` is now allowed. Then,
```agda
r : R A
f r = a
s : S A
f s = f r
```
disambiguates to:
```agda
r : R A
R.f r = a
s : S A
S.f s = R.f r
```
If the type of the projection is known, it can also be disambiguated
unapplied.
```agda
unapplied : R A -> A
unapplied = f
```
* Postfix projections
[Issue [#1963](https://github.com/agda/agda/issues/1963)].
Agda now supports a postfix syntax for projection application.
This style is more in harmony with copatterns. For example:
```agda
record Stream (A : Set) : Set where
coinductive
field head : A
tail : Stream A
open Stream
repeat : ∀{A} (a : A) → Stream A
repeat a .head = a
repeat a .tail = repeat a
zipWith : ∀{A B C} (f : A → B → C) (s : Stream A) (t : Stream B) → Stream C
zipWith f s t .head = f (s .head) (t .head)
zipWith f s t .tail = zipWith f (s .tail) (t .tail)
module Fib (Nat : Set) (zero one : Nat) (plus : Nat → Nat → Nat) where
{-# TERMINATING #-}
fib : Stream Nat
fib .head = zero
fib .tail .head = one
fib .tail .tail = zipWith plus fib (fib .tail)
```
The thing we eliminate with projection now is visibly the head,
i.e., the left-most expression of the sequence (e.g. `repeat` in
`repeat a .tail`).
The syntax overlaps with dot patterns, but for type correct left
hand sides there is no confusion: Dot patterns eliminate function
types, while (postfix) projection patterns eliminate record types.
By default, Agda prints system-generated projections (such as by
eta-expansion or case splitting) prefix. This can be changed with
the new option:
```agda
{-# OPTIONS --postfix-projections #-}
```
Result splitting in extended lambdas (aka pattern lambdas) always
produces postfix projections, as prefix projection pattern do not
work here: a prefix projection needs to go left of the head, but the
head is omitted in extended lambdas.
```agda
dup : ∀{A : Set}(a : A) → A × A
dup = λ{ a → ? }
```
Result splitting (`C-c C-c RET`) here will yield:
```agda
dup = λ{ a .proj₁ → ? ; a .proj₂ → ? }
```
* Projection parameters
[Issue [#1954](https://github.com/agda/agda/issues/1954)].
When copying a module, projection parameters will now stay hidden
arguments, even if the module parameters are visible.
This matches the situation we had for constructors since long.
Example:
```agda
module P (A : Set) where
record R : Set where
field f : A
open module Q A = P A
```
Parameter `A` is now hidden in `R.f`:
```agda
test : ∀{A} → R A → A
test r = R.f r
```
Note that a module parameter that corresponds to the record value
argument of a projection will not be hidden.
```agda
module M (A : Set) (r : R A) where
open R A r public
test' : ∀{A} → R A → A
test' r = M.f r
```
* Eager insertion of implicit arguments
[Issue [#2001](https://github.com/agda/agda/issues/2001)]
Implicit arguments are now (again) eagerly inserted in left-hand sides. The
previous behaviour of inserting implicits for where blocks, but not
right-hand sides was not type safe.
* Module applications can now be eta expanded/contracted without
changing their behaviour
[Issue #[1985](https://github.com/agda/agda/issues/1985)]
Previously definitions exported using `open public` got the
incorrect type for underapplied module applications.
Example:
```agda
module A where
postulate A : Set
module B (X : Set) where
open A public
module C₁ = B
module C₂ (X : Set) = B X
```
Here both `C₁.A` and `C₂.A` have type `(X : Set) → Set`.
* Polarity pragmas.
Polarity pragmas can be attached to postulates. The polarities express
how the postulate's arguments are used. The following polarities
are available:
`_`: Unused.
`++`: Strictly positive.
`+`: Positive.
`-`: Negative.
`*`: Unknown/mixed.
Polarity pragmas have the form
```
{-# POLARITY name <zero or more polarities> #-}
```
and can be given wherever fixity declarations can be given. The
listed polarities apply to the given postulate's arguments
(explicit/implicit/instance), from left to right. Polarities
currently cannot be given for module parameters. If the postulate
takes n arguments (excluding module parameters), then the number of
polarities given must be between 0 and n (inclusive).
Polarity pragmas make it possible to use postulated type formers in
recursive types in the following way:
```agda
postulate
∥_∥ : Set → Set
{-# POLARITY ∥_∥ ++ #-}
data D : Set where
c : ∥ D ∥ → D
```
Note that one can use postulates that may seem benign, together with
polarity pragmas, to prove that the empty type is inhabited:
```agda
postulate
_⇒_ : Set → Set → Set
lambda : {A B : Set} → (A → B) → A ⇒ B
apply : {A B : Set} → A ⇒ B → A → B
{-# POLARITY _⇒_ ++ #-}
data ⊥ : Set where
data D : Set where
c : D ⇒ ⊥ → D
not-inhabited : D → ⊥
not-inhabited (c f) = apply f (c f)
inhabited : D
inhabited = c (lambda not-inhabited)
bad : ⊥
bad = not-inhabited inhabited
```
Polarity pragmas are not allowed in safe mode.
* Declarations in a `where`-block are now
private. [Issue [#2101](https://github.com/agda/agda/issues/2101)]
This means that
```agda
f ps = body where
decls
```
is now equivalent to
```agda
f ps = body where
private
decls
```
This changes little, since the `decls` were anyway not in scope
outside `body`. However, it makes a difference for abstract
definitions, because private type signatures can see through
abstract definitions. Consider:
```agda
record Wrap (A : Set) : Set where
field unwrap : A
postulate
P : ∀{A : Set} → A → Set
abstract
unnamedWhere : (A : Set) → Set
unnamedWhere A = A
where -- the following definitions are private!
B : Set
B = Wrap A
postulate
b : B
test : P (Wrap.unwrap b) -- succeeds
```
The `abstract` is inherited in `where`-blocks from the parent (here:
function `unnamedWhere`). Thus, the definition of `B` is opaque and
the type equation `B = Wrap A` cannot be used to check type
signatures, not even of abstract definitions. Thus, checking the
type `P (Wrap.unwrap b)` would fail. However, if `test` is
private, abstract definitions are translucent in its type, and
checking succeeds. With the implemented change, all
`where`-definitions are private, in this case `B`, `b`, and `test`,
and the example succeeds.
Nothing changes for the named forms of `where`,
```agda
module M where
module _ where
```
For instance, this still fails:
```agda
abstract
unnamedWhere : (A : Set) → Set
unnamedWhere A = A
module M where
B : Set
B = Wrap A
postulate
b : B
test : P (Wrap.unwrap b) -- fails
```
* Private anonymous modules now work as expected
[Issue [#2199](https://github.com/agda/agda/issues/2199)]
Previously the `private` was ignored for anonymous modules causing
its definitions to be visible outside the module containing the
anonymous module. This is no longer the case. For instance,
```agda
module M where
private
module _ (A : Set) where
Id : Set
Id = A
foo : Set → Set
foo = Id
open M
bar : Set → Set
bar = Id -- Id is no longer in scope here
```
* Pattern synonyms are now expanded on left hand sides of DISPLAY
pragmas [Issue [#2132](https://github.com/agda/agda/issues/2132)].
Example:
```agda
data D : Set where
C c : D
g : D → D
pattern C′ = C
{-# DISPLAY C′ = C′ #-}
{-# DISPLAY g C′ = c #-}
```
This now behaves as:
```agda
{-# DISPLAY C = C′ #-}
{-# DISPLAY g C = c #-}
```
Expected error for
```agda
test : C ≡ g C
test = refl
```
is thus:
```
C′ != c of type D
```
* The built-in floats have new semantics to fix inconsistencies
and to improve cross-platform portability.
- Float equality has been split into two primitives.
``primFloatEquality`` is designed to establish
decidable propositional equality while
``primFloatNumericalEquality`` is intended for numerical
computations. They behave as follows:
```
primFloatEquality NaN NaN = True
primFloatEquality 0.0 -0.0 = False
primFloatNumericalEquality NaN NaN = False
primFloatNumericalEquality 0.0 -0.0 = True
```
This change fixes an inconsistency, see [Issue [#2169](https://github.com/agda/agda/issues/2169)].
For further detail see the [user manual](http://agda.readthedocs.io/en/v2.5.2/language/built-ins.html#floats).
- Floats now have only one `NaN` value. This is necessary
for proper Float support in the JavaScript backend,
as JavaScript (and some other platforms) only support
one `NaN` value.
- The primitive function `primFloatLess` was renamed
`primFloatNumericalLess`.
* Added new primitives to built-in floats:
- `primFloatNegate : Float → Float`
[Issue [#2194](https://github.com/agda/agda/issues/2194)]
- Trigonometric primitives
[Issue [#2200](https://github.com/agda/agda/issues/2200)]:
```agda
primCos : Float → Float
primTan : Float → Float
primASin : Float → Float
primACos : Float → Float
primATan : Float → Float
primATan2 : Float → Float → Float
```
* Anonymous declarations
[Issue [#1465](https://github.com/agda/agda/issues/1465)].
A module can contain an arbitrary number of declarations
named `_` which will scoped-checked and type-checked but
won't be made available in the scope (nor exported). They
cannot introduce arguments on the LHS (but one can use
lambda-abstractions on the RHS) and they cannot be defined
by recursion.
```agda
_ : Set → Set
_ = λ x → x
```
### Rewriting
* The REWRITE pragma can now handle several names. E.g.:
```agda
{-# REWRITE eq1 eq2 #-}
```
### Reflection
* You can now use macros in reflected terms
[Issue [#2130](https://github.com/agda/agda/issues/2130)].
For instance, given a macro
```agda
macro
some-tactic : Term → TC ⊤
some-tactic = ...
```
the term `def (quote some-tactic) []` represents a call to the
macro. This makes it a lot easier to compose tactics.
* The reflection machinery now uses normalisation less often:
* Macros no longer normalise the (automatically quoted) term
arguments.
* The TC primitives `inferType`, `checkType` and `quoteTC` no longer
normalise their arguments.
* The following deprecated constructions may also have been changed:
`quoteGoal`, `quoteTerm`, `quoteContext` and `tactic`.
* New TC primitive: `withNormalisation`.
To recover the old normalising behaviour of `inferType`, `checkType`,
`quoteTC` and `getContext`, you can wrap them inside a call to
`withNormalisation true`:
```agda
withNormalisation : ∀ {a} {A : Set a} → Bool → TC A → TC A
```
* New TC primitive: `reduce`.
```agda
reduce : Term → TC Term
```
Reduces its argument to weak head normal form.
* Added new TC primitive: `isMacro`
[Issue [#2182](https://github.com/agda/agda/issues/2182)]
```agda
isMacro : Name → TC Bool
```
Returns `true` if the name refers to a macro, otherwise `false`.
* The `record-type` constructor now has an extra argument containing
information about the record type's fields:
```agda
data Definition : Set where
…
record-type : (c : Name) (fs : List (Arg Name)) → Definition
…
```
Type checking
-------------
* Files with open metas can be imported now
[Issue [#964](https://github.com/agda/agda/issues/964)]. This
should make simultaneous interactive development on several modules
more pleasant.
Requires option: `--allow-unsolved-metas`
Internally, before serialization, open metas are turned into postulates named
```
unsolved#meta.<nnn>
```
where `<nnn>` is the internal meta variable number.
* The performance of the compile-time evaluator has been greatly improved.
- Fixed a memory leak in evaluator
(Issue [#2147](https://github.com/agda/agda/issues/2147)).
- Reduction speed improved by an order of magnitude and is now
comparable to the performance of GHCi. Still call-by-name though.
* The detection of types that satisfy K added in Agda 2.5.1 has been
rolled back (see
Issue [#2003](https://github.com/agda/agda/issues/2003)).
* Eta-equality for record types is now only on after the positivity
checker has confirmed it is safe to have it. Eta-equality for
unguarded inductive records previously lead to looping of the type
checker.
[See Issue [#2197](https://github.com/agda/agda/issues/2197)]
```agda
record R : Set where
inductive
field r : R
loops : R
loops = ?
```
As a consequence of this change, the following example does not
type-check any more:
```agda
mutual
record ⊤ : Set where
test : ∀ {x y : ⊤} → x ≡ y
test = refl
```
It fails because the positivity checker is only run after the mutual
block, thus, eta-equality for `⊤` is not available when checking
test.
One can declare eta-equality explicitly, though, to make this
example work.
```agda
mutual
record ⊤ : Set where
eta-equality
test : ∀ {x y : ⊤} → x ≡ y
test = refl
```
* Records with instance fields are now eta expanded before instance search.
For instance, assuming `Eq` and `Ord` with boolean functions `_==_` and `_<_`
respectively,
```agda
record EqAndOrd (A : Set) : Set where
field {{eq}} : Eq A
{{ord}} : Ord A
leq : {A : Set} {{_ : EqAndOrd A}} → A → A → Bool
leq x y = x == y || x < y
```
Here the `EqAndOrd` record is automatically unpacked before instance search,
revealing the component `Eq` and `Ord` instances.
This can be used to simulate superclass dependencies.
* Overlappable record instance fields.
Instance fields in records can be marked as overlappable using the new
`overlap` keyword:
```agda
record Ord (A : Set) : Set where
field
_<_ : A → A → Bool
overlap {{eqA}} : Eq A
```
When instance search finds multiple candidates for a given instance goal and
they are **all** overlappable it will pick the left-most candidate instead of
refusing to solve the instance goal.
This can be use to solve the problem arising from shared "superclass"
dependencies. For instance, if you have, in addition to `Ord` above, a `Num`
record that also has an `Eq` field and want to write a function requiring
both `Ord` and `Num`, any `Eq` constraint will be solved by the `Eq` instance
from whichever argument that comes first.
```agda
record Num (A : Set) : Set where
field
fromNat : Nat → A
overlap {{eqA}} : Eq A
lessOrEqualFive : {A : Set} {{NumA : Num A}} {{OrdA : Ord A}} → A → Bool
lessOrEqualFive x = x == fromNat 5 || x < fromNat 5
```
In this example the call to `_==_` will use the `eqA` field from `NumA`
rather than the one from `OrdA`. Note that these may well be different.
* Instance fields can be left out of copattern matches
[Issue [#2288](https://github.com/agda/agda/issues/2288)]
Missing cases for instance fields (marked `{{` `}}`) in copattern matches
will be solved using instance search. This makes defining instances with
superclass fields much nicer. For instance, we can define `Nat` instances of
`Eq`, `Ord` and `Num` from above as follows:
```agda
instance
EqNat : Eq Nat
_==_ {{EqNat}} n m = eqNat n m
OrdNat : Ord Nat
_<_ {{OrdNat}} n m = lessNat n m
NumNat : Num Nat
fromNat {{NumNat}} n = n
```
The `eqA` fields of `Ord` and `Num` are filled in using instance search (with
`EqNat` in this case).
* Limited instance search depth
[Issue [#2269](https://github.com/agda/agda/issues/2269)]
To prevent instance search from looping on bad instances
(see [Issue #1743](https://github.com/agda/agda/issues/1743)) the search
depth of instance search is now limited. The maximum depth can be set with
the `--instance-search-depth` flag and the default value is `500`.
Emacs mode
----------
* New command `C-u C-u C-c C-n`: Use `show` to display the result of
normalisation.
Calling `C-u C-u C-c C-n` on an expression `e` (in a hole or at top level)
normalises `show e` and prints the resulting string, or an error message if
the expression does not normalise to a literal string.
This is useful when working with complex data structures for which you have
defined a nice `Show` instance.
Note that the name `show` is hardwired into the command.
* Changed feature: Interactively split result.
Make-case (`C-c C-c`) with no variables will now *either* introduce
function arguments *or* do a copattern split (or fail).
This is as before:
```agda
test : {A B : Set} (a : A) (b : B) → A × B
test a b = ?
-- expected:
-- proj₁ (test a b) = {!!}
-- proj₂ (test a b) = {!!}
testFun : {A B : Set} (a : A) (b : B) → A × B
testFun = ?
-- expected:
-- testFun a b = {!!}
```
This is has changed:
```agda
record FunRec A : Set where
field funField : A → A
open FunRec
testFunRec : ∀{A} → FunRec A
testFunRec = ?
-- expected (since 2016-05-03):
-- funField testFunRec = {!!}
-- used to be:
-- funField testFunRec x = {!!}
```
* Changed feature: Split on hidden variables.
Make-case (`C-c C-c`) will no longer split on the given hidden
variables, but only make them visible. (Splitting can then be
performed in a second go.)
```agda
test : ∀{N M : Nat} → Nat → Nat → Nat
test N M = {!.N N .M!}
```
Invoking splitting will result in:
```agda
test {N} {M} zero M₁ = ?
test {N} {M} (suc N₁) M₁ = ?
```
The hidden `.N` and `.M` have been brought into scope, the
visible `N` has been split upon.
* Non-fatal errors/warnings.
Non-fatal errors and warnings are now displayed in the info buffer
and do not interrupt the typechecking of the file.
Currently termination errors, unsolved metavariables, unsolved
constraints, positivity errors, deprecated BUILTINs, and empty
REWRITING pragmas are non-fatal errors.
* Highlighting for positivity check failures
Negative occurences of a datatype in its definition are now
highlighted in a way similar to termination errors.
* The abbrev for codata was replaced by an abbrev for code
environments.
If you type `c C-x '` (on a suitably standard setup), then Emacs
will insert the following text:
```agda
\begin{code}<newline> <cursor><newline>\end{code}<newline>.
```
* The LaTeX backend can now be invoked from the Emacs mode.
Using the compilation command (`C-c C-x C-c`).
The flag `--latex-dir` can be used to set the output directory (by
default: `latex`). Note that if this directory is a relative path,
then it is interpreted relative to the "project root". (When the
LaTeX backend is invoked from the command line the path is
interpreted relative to the current working directory.) Example: If
the module `A.B.C` is located in the file `/foo/A/B/C.agda`, then
the project root is `/foo/`, and the default output directory is
`/foo/latex/`.
* The compilation command (`C-c C-x C-c`) now by default asks for a
backend.
To avoid this question, set the customisation variable
`agda2-backend` to an appropriate value.
* The command `agda2-measure-load-time` no longer "touches" the file,
and the optional argument `DONT-TOUCH` has been removed.
* New command `C-u (C-u) C-c C-s`: Simplify or normalise the solution `C-c C-s` produces
When writing examples, it is nice to have the hole filled in with
a normalised version of the solution. Calling `C-c C-s` on
```agda
_ : reverse (0 ∷ 1 ∷ []) ≡ ?
_ = refl
```
used to yield the non informative `reverse (0 ∷ 1 ∷ [])` when we would
have hopped to get `1 ∷ 0 ∷ []` instead. We can now control finely the
degree to which the solution is simplified.
* Changed feature: Solving the hole at point
Calling `C-c C-s` inside a specific goal does not solve *all* the goals
already instantiated internally anymore: it only solves the one at hand
(if possible).
* New bindings: All the blackboard bold letters are now available
[Pull Request [#2305](https://github.com/agda/agda/pull/2305)]
The Agda input method only bound a handful of the blackboard bold letters
but programmers were actually using more than these. They are now all
available: lowercase and uppercase. Some previous bindings had to be
modified for consistency. The naming scheme is as follows:
* `\bx` for lowercase blackboard bold
* `\bX` for uppercase blackboard bold
* `\bGx` for lowercase greek blackboard bold (similar to `\Gx` for
greeks)
* `\bGX` for uppercase greek blackboard bold (similar to `\GX` for
uppercase greeks)
* Replaced binding for go back
Use `M-,` (instead of `M-*`) for go back in Emacs ≥ 25.1 (and
continue using `M-*` with previous versions of Emacs).
Compiler backends
-----------------
* JS compiler backend
The JavaScript backend has been (partially) rewritten. The
JavaScript backend now supports most Agda features, notably
copatterns can now be compiled to JavaScript. Furthermore, the
existing optimizations from the other backends now apply to the
JavaScript backend as well.
* GHC, JS and UHC compiler backends
Added new primitives to built-in floats
[Issues [#2194](https://github.com/agda/agda/issues/2194) and
[#2200](https://github.com/agda/agda/issues/2200)]:
```agda
primFloatNegate : Float → Float
primCos : Float → Float
primTan : Float → Float
primASin : Float → Float
primACos : Float → Float
primATan : Float → Float
primATan2 : Float → Float → Float
```
LaTeX backend
-------------
* Code blocks are now (by default) surrounded by vertical space.
[Issue [#2198](https://github.com/agda/agda/issues/2198)]
Use `\AgdaNoSpaceAroundCode{}` to avoid this vertical space, and
`\AgdaSpaceAroundCode{}` to reenable it.
Note that, if `\AgdaNoSpaceAroundCode{}` is used, then empty lines
before or after a code block will not necessarily lead to empty
lines in the generated document. However, empty lines *inside* the
code block do (by default) lead to empty lines in the output.
If you prefer the previous behaviour, then you can use the `agda.sty`
file that came with the previous version of Agda.
* `\AgdaHide{...}` now eats trailing spaces (using `\ignorespaces`).
* New environments: `AgdaAlign`, `AgdaSuppressSpace` and
`AgdaMultiCode`.
Sometimes one might want to break up a code block into multiple
pieces, but keep code in different blocks aligned with respect to
each other. Then one can use the `AgdaAlign` environment. Example
usage:
```latex
\begin{AgdaAlign}
\begin{code}
code
code (more code)
\end{code}
Explanation...
\begin{code}
aligned with "code"
code (aligned with (more code))
\end{code}
\end{AgdaAlign}
```
Note that `AgdaAlign` environments should not be nested.
Sometimes one might also want to hide code in the middle of a code
block. This can be accomplished in the following way:
```latex
\begin{AgdaAlign}
\begin{code}
visible
\end{code}
\AgdaHide{
\begin{code}
hidden
\end{code}}
\begin{code}
visible
\end{code}
\end{AgdaAlign}
```
However, the result may be ugly: extra space is perhaps inserted
around the code blocks.
The `AgdaSuppressSpace` environment ensures that extra space is only
inserted before the first code block, and after the last one (but
not if `\AgdaNoSpaceAroundCode{}` is used).
The environment takes one argument, the number of wrapped code
blocks (excluding hidden ones). Example usage:
```latex
\begin{AgdaAlign}
\begin{code}
code
more code
\end{code}
Explanation...
\begin{AgdaSuppressSpace}{2}
\begin{code}
aligned with "code"
aligned with "more code"
\end{code}
\AgdaHide{
\begin{code}
hidden code
\end{code}}
\begin{code}
also aligned with "more code"
\end{code}
\end{AgdaSuppressSpace}
\end{AgdaAlign}
```
Note that `AgdaSuppressSpace` environments should not be nested.
There is also a combined environment, `AgdaMultiCode`, that combines
the effects of `AgdaAlign` and `AgdaSuppressSpace`.
Tools
-----
### agda-ghc-names
The `agda-ghc-names` now has its own repository at
https://github.com/agda/agda-ghc-names
and is no longer distributed with Agda.
|