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
//! The registry of library special functions, the nodes
//! [`ExprNode::Lib`](crate::base::node::ExprNode::Lib).
//!
//! Elementary functions (`sin`, `exp`, `gamma`, `erf`, …) are dedicated
//! `ExprNode` variants. The larger family of special functions — Bessel,
//! orthogonal polynomials, incomplete gamma, elliptic integrals, the integer
//! sequences — is stored as `Lib(LibFn, args)`. [`LibFn`] is the closed
//! list of those functions, so a consumer that matches on it (an
//! evaluator, a differentiator, a printer) is checked for completeness by
//! the compiler instead of failing at run time on a name it forgot.
//!
//! Nodes are built with `Arena::lib_apply` (or the arity-checked
//! `Arena::func`). Until 0.49 they were `Apply(SymbolId, args)` nodes
//! resolved by the interned text of the head, so a user function named
//! like a library function took on its semantics. The name
//! ([`LibFn::name`]) is still the head of the JSON `Apply` form and of the
//! display.
//!
//! The list of functions itself (since 0.49) is the one list of *every*
//! function, node-backed, library or internal, in `base/func.rs`: it
//! generates [`LibFn`] — its variants, names and arities — together with
//! the crate's internal function identity, and this module re-exports it.
use fmt;
pub use crateLibFn;
/// How many arguments a library function takes.