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
|
Writing Coq libraries and plugins
===================================
This section presents the part of the Coq language that is useful only
to library and plugin authors. A tutorial for writing Coq plugins is
available in the Coq repository in `doc/plugin_tutorial
<https://github.com/coq/coq/tree/master/doc/plugin_tutorial>`_.
Deprecating library objects or tactics
--------------------------------------
You may use the following :term:`attribute` to deprecate a notation or
tactic. When renaming a definition or theorem, you can introduce a
deprecated compatibility alias using :cmd:`Notation (abbreviation)`
(see :ref:`the example below <compatibility-alias>`).
.. attr:: deprecated ( {? since = @string , } {? note = @string } )
:name: deprecated
At least one of :n:`since` or :n:`note` must be present. If both
are present, either one may appear first and they must be separated
by a comma.
This attribute is supported by the following commands: :cmd:`Ltac`,
:cmd:`Tactic Notation`, :cmd:`Notation`, :cmd:`Infix`, :cmd:`Ltac2`,
:cmd:`Ltac2 Notation`, :cmd:`Ltac2 external`.
It can trigger the following warnings:
.. warn:: Tactic @qualid is deprecated since @string__since. @string__note.
Tactic Notation @qualid is deprecated since @string__since. @string__note.
Notation @string is deprecated since @string__since. @string__note.
Ltac2 definition @qualid is deprecated since @string__since. @string__note.
Ltac2 alias @qualid is deprecated since @string__since. @string__note.
Ltac2 notation {+ @ltac2_scope } is deprecated since @string__since. @string__note.
:n:`@qualid` or :n:`@string` is the notation,
:n:`@string__since` is the version number, :n:`@string__note` is
the note (usually explains the replacement).
.. example:: Deprecating a tactic.
.. coqtop:: all abort warn
#[deprecated(since="0.9", note="Use idtac instead.")]
Ltac foo := idtac.
Goal True.
Proof.
now foo.
.. _compatibility-alias:
.. example:: Introducing a compatibility alias
Let's say your library initially contained:
.. coqtop:: in
Definition foo x := S x.
and you want to rename `foo` into `bar`, but you want to avoid breaking
your users' code without advanced notice. To do so, replace the previous
code by the following:
.. coqtop:: in reset
Definition bar x := S x.
#[deprecated(since="1.2", note="Use bar instead.")]
Notation foo := bar (only parsing).
Then, the following code still works, but emits a warning:
.. coqtop:: all warn
Check (foo 0).
|