Fixed missing functionality in dashu with their methods still has some issue with move
This commit is contained in:
241
Cargo.lock
generated
241
Cargo.lock
generated
@@ -55,6 +55,12 @@ version = "0.12.3"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff"
|
checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "base64"
|
||||||
|
version = "0.21.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bit-set"
|
name = "bit-set"
|
||||||
version = "0.5.3"
|
version = "0.5.3"
|
||||||
@@ -316,8 +322,6 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "dashu"
|
name = "dashu"
|
||||||
version = "0.3.1"
|
version = "0.3.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "51a1b5a00793e3ac2239993ef582603764bcb333a4d04c2a0944639a7e916c85"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"dashu-base",
|
"dashu-base",
|
||||||
"dashu-float",
|
"dashu-float",
|
||||||
@@ -329,41 +333,33 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "dashu-base"
|
name = "dashu-base"
|
||||||
version = "0.3.1"
|
version = "0.3.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "6f2585452b8ecf7c874045dba02a7914b7e5b2e3cdd5e152573413aa290197aa"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "dashu-float"
|
name = "dashu-float"
|
||||||
version = "0.3.2"
|
version = "0.3.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "7a168f338914fab603c31a371207c8b3245ab5ff5e9a0f4fd64a9b5f8a972d1f"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"dashu-base",
|
"dashu-base",
|
||||||
"dashu-int",
|
"dashu-int",
|
||||||
|
"num-order",
|
||||||
"num-traits",
|
"num-traits",
|
||||||
"rand",
|
|
||||||
"static_assertions",
|
"static_assertions",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "dashu-int"
|
name = "dashu-int"
|
||||||
version = "0.3.1"
|
version = "0.3.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "57a1009a3ce0c4c64e977c5e7dd8c475278750e145cbb8956d1e28832f557975"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"dashu-base",
|
"dashu-base",
|
||||||
|
"num-modular 0.6.0",
|
||||||
"num-order",
|
"num-order",
|
||||||
"num-traits",
|
"num-traits",
|
||||||
"rand",
|
|
||||||
"static_assertions",
|
"static_assertions",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "dashu-macros"
|
name = "dashu-macros"
|
||||||
version = "0.3.1"
|
version = "0.3.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "f6fc2425b6724a7d5bfc8e57044e231803b5fc3a7283d6efbff34bfab6ebe014"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"dashu-base",
|
"dashu-base",
|
||||||
"dashu-float",
|
"dashu-float",
|
||||||
@@ -376,14 +372,12 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "dashu-ratio"
|
name = "dashu-ratio"
|
||||||
version = "0.3.2"
|
version = "0.3.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "b4b57c839e72af6be14e5c55630ffc9429c9970aed48f7db449b2399467336b4"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"dashu-base",
|
"dashu-base",
|
||||||
"dashu-float",
|
"dashu-float",
|
||||||
"dashu-int",
|
"dashu-int",
|
||||||
|
"num-order",
|
||||||
"num-traits",
|
"num-traits",
|
||||||
"rand",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -471,6 +465,15 @@ version = "1.8.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91"
|
checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "encoding_rs"
|
||||||
|
version = "0.8.32"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "endian-type"
|
name = "endian-type"
|
||||||
version = "0.1.2"
|
version = "0.1.2"
|
||||||
@@ -549,6 +552,15 @@ version = "0.1.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
|
checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "form_urlencoded"
|
||||||
|
version = "1.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652"
|
||||||
|
dependencies = [
|
||||||
|
"percent-encoding",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "funty"
|
name = "funty"
|
||||||
version = "2.0.0"
|
version = "2.0.0"
|
||||||
@@ -718,8 +730,6 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "gmp-mpfr-sys"
|
name = "gmp-mpfr-sys"
|
||||||
version = "1.5.3"
|
version = "1.5.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "13eabc29d16e4a621b495e3919c71ebb7caaed24380955671e7d417370fea95d"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
"windows-sys 0.42.0",
|
"windows-sys 0.42.0",
|
||||||
@@ -821,6 +831,29 @@ dependencies = [
|
|||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "http-body"
|
||||||
|
version = "1.0.0-rc.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "951dfc2e32ac02d67c90c0d65bd27009a635dc9b381a2cc7d284ab01e3a0150d"
|
||||||
|
dependencies = [
|
||||||
|
"bytes",
|
||||||
|
"http",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "http-body-util"
|
||||||
|
version = "0.1.0-rc.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "08ef12f041acdd397010e5fb6433270c147d3b8b2d0a840cd7fff8e531dca5c8"
|
||||||
|
dependencies = [
|
||||||
|
"bytes",
|
||||||
|
"futures-util",
|
||||||
|
"http",
|
||||||
|
"http-body 1.0.0-rc.2",
|
||||||
|
"pin-project-lite",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "httparse"
|
name = "httparse"
|
||||||
version = "1.8.0"
|
version = "1.8.0"
|
||||||
@@ -845,7 +878,7 @@ dependencies = [
|
|||||||
"futures-util",
|
"futures-util",
|
||||||
"h2",
|
"h2",
|
||||||
"http",
|
"http",
|
||||||
"http-body",
|
"http-body 0.4.5",
|
||||||
"httparse",
|
"httparse",
|
||||||
"httpdate",
|
"httpdate",
|
||||||
"itoa",
|
"itoa",
|
||||||
@@ -893,6 +926,16 @@ dependencies = [
|
|||||||
"cc",
|
"cc",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "idna"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c"
|
||||||
|
dependencies = [
|
||||||
|
"unicode-bidi",
|
||||||
|
"unicode-normalization",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "indexmap"
|
name = "indexmap"
|
||||||
version = "1.9.3"
|
version = "1.9.3"
|
||||||
@@ -923,6 +966,12 @@ dependencies = [
|
|||||||
"windows-sys 0.48.0",
|
"windows-sys 0.48.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ipnet"
|
||||||
|
version = "2.8.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "itertools"
|
name = "itertools"
|
||||||
version = "0.10.5"
|
version = "0.10.5"
|
||||||
@@ -994,8 +1043,6 @@ checksum = "f92be4933c13fd498862a9e02a3055f8a8d9c039ce33db97306fd5a6caa7f29b"
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "libffi"
|
name = "libffi"
|
||||||
version = "3.2.0"
|
version = "3.2.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "ce826c243048e3d5cec441799724de52e2d42f820468431fc3fceee2341871e2"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
"libffi-sys",
|
"libffi-sys",
|
||||||
@@ -1004,8 +1051,6 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "libffi-sys"
|
name = "libffi-sys"
|
||||||
version = "2.3.0"
|
version = "2.3.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "f36115160c57e8529781b4183c2bb51fdc1f6d6d1ed345591d84be7703befb3c"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cc",
|
"cc",
|
||||||
]
|
]
|
||||||
@@ -1107,6 +1152,12 @@ dependencies = [
|
|||||||
"autocfg",
|
"autocfg",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "mime"
|
||||||
|
version = "0.3.17"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mio"
|
name = "mio"
|
||||||
version = "0.7.14"
|
version = "0.7.14"
|
||||||
@@ -1246,13 +1297,17 @@ dependencies = [
|
|||||||
"num-traits",
|
"num-traits",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "num-modular"
|
||||||
|
version = "0.6.0"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "num-order"
|
name = "num-order"
|
||||||
version = "1.0.4"
|
version = "1.0.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e81e321057a0370997b13e6638bba6bd7f6f426e1f8e9a2562490a28eb23e1bc"
|
checksum = "e81e321057a0370997b13e6638bba6bd7f6f426e1f8e9a2562490a28eb23e1bc"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"num-modular",
|
"num-modular 0.5.1",
|
||||||
"num-traits",
|
"num-traits",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -1388,6 +1443,12 @@ dependencies = [
|
|||||||
"windows-targets",
|
"windows-targets",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "percent-encoding"
|
||||||
|
version = "2.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "phf"
|
name = "phf"
|
||||||
version = "0.9.0"
|
version = "0.9.0"
|
||||||
@@ -1638,6 +1699,43 @@ version = "0.1.10"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
|
checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "reqwest"
|
||||||
|
version = "0.11.18"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55"
|
||||||
|
dependencies = [
|
||||||
|
"base64 0.21.2",
|
||||||
|
"bytes",
|
||||||
|
"encoding_rs",
|
||||||
|
"futures-core",
|
||||||
|
"futures-util",
|
||||||
|
"h2",
|
||||||
|
"http",
|
||||||
|
"http-body 0.4.5",
|
||||||
|
"hyper",
|
||||||
|
"hyper-tls",
|
||||||
|
"ipnet",
|
||||||
|
"js-sys",
|
||||||
|
"log",
|
||||||
|
"mime",
|
||||||
|
"native-tls",
|
||||||
|
"once_cell",
|
||||||
|
"percent-encoding",
|
||||||
|
"pin-project-lite",
|
||||||
|
"serde",
|
||||||
|
"serde_json",
|
||||||
|
"serde_urlencoded",
|
||||||
|
"tokio",
|
||||||
|
"tokio-native-tls",
|
||||||
|
"tower-service",
|
||||||
|
"url",
|
||||||
|
"wasm-bindgen",
|
||||||
|
"wasm-bindgen-futures",
|
||||||
|
"web-sys",
|
||||||
|
"winreg",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ring"
|
name = "ring"
|
||||||
version = "0.16.20"
|
version = "0.16.20"
|
||||||
@@ -1676,8 +1774,6 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "rug"
|
name = "rug"
|
||||||
version = "1.19.2"
|
version = "1.19.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "555e8b44763d034526db899c88cd56ccc4486cd38b444c8aa0e79d4e70ae5a34"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"az",
|
"az",
|
||||||
"gmp-mpfr-sys",
|
"gmp-mpfr-sys",
|
||||||
@@ -1763,10 +1859,11 @@ name = "scryer-prolog"
|
|||||||
version = "0.9.1"
|
version = "0.9.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"assert_cmd",
|
"assert_cmd",
|
||||||
"base64",
|
"base64 0.12.3",
|
||||||
"bit-set",
|
"bit-set",
|
||||||
"bitvec",
|
"bitvec",
|
||||||
"blake2 0.8.1",
|
"blake2 0.8.1",
|
||||||
|
"bytes",
|
||||||
"chrono",
|
"chrono",
|
||||||
"cpu-time",
|
"cpu-time",
|
||||||
"crossterm",
|
"crossterm",
|
||||||
@@ -1780,6 +1877,7 @@ dependencies = [
|
|||||||
"fxhash",
|
"fxhash",
|
||||||
"git-version",
|
"git-version",
|
||||||
"hostname",
|
"hostname",
|
||||||
|
"http-body-util",
|
||||||
"hyper",
|
"hyper",
|
||||||
"hyper-tls",
|
"hyper-tls",
|
||||||
"indexmap",
|
"indexmap",
|
||||||
@@ -1795,7 +1893,9 @@ dependencies = [
|
|||||||
"predicates-core",
|
"predicates-core",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
|
"rand",
|
||||||
"ref_thread_local",
|
"ref_thread_local",
|
||||||
|
"reqwest",
|
||||||
"ring",
|
"ring",
|
||||||
"ripemd160",
|
"ripemd160",
|
||||||
"roxmltree",
|
"roxmltree",
|
||||||
@@ -1853,9 +1953,32 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde"
|
name = "serde"
|
||||||
version = "1.0.164"
|
version = "1.0.174"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d"
|
checksum = "3b88756493a5bd5e5395d53baa70b194b05764ab85b59e43e4b8f4e1192fa9b1"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_json"
|
||||||
|
version = "1.0.103"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d03b412469450d4404fe8499a268edd7f8b79fecb074b0d812ad64ca21f4031b"
|
||||||
|
dependencies = [
|
||||||
|
"itoa",
|
||||||
|
"ryu",
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_urlencoded"
|
||||||
|
version = "0.7.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
|
||||||
|
dependencies = [
|
||||||
|
"form_urlencoded",
|
||||||
|
"itoa",
|
||||||
|
"ryu",
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serial_test"
|
name = "serial_test"
|
||||||
@@ -2147,6 +2270,21 @@ dependencies = [
|
|||||||
"winapi",
|
"winapi",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tinyvec"
|
||||||
|
version = "1.6.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
|
||||||
|
dependencies = [
|
||||||
|
"tinyvec_macros",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tinyvec_macros"
|
||||||
|
version = "0.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "to-syn-value"
|
name = "to-syn-value"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
@@ -2260,12 +2398,27 @@ version = "1.16.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba"
|
checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-bidi"
|
||||||
|
version = "0.3.13"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-ident"
|
name = "unicode-ident"
|
||||||
version = "1.0.9"
|
version = "1.0.9"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0"
|
checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-normalization"
|
||||||
|
version = "0.1.22"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
|
||||||
|
dependencies = [
|
||||||
|
"tinyvec",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-segmentation"
|
name = "unicode-segmentation"
|
||||||
version = "1.10.1"
|
version = "1.10.1"
|
||||||
@@ -2284,6 +2437,17 @@ version = "0.7.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
|
checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "url"
|
||||||
|
version = "2.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb"
|
||||||
|
dependencies = [
|
||||||
|
"form_urlencoded",
|
||||||
|
"idna",
|
||||||
|
"percent-encoding",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "utf-8"
|
name = "utf-8"
|
||||||
version = "0.7.6"
|
version = "0.7.6"
|
||||||
@@ -2373,6 +2537,18 @@ dependencies = [
|
|||||||
"wasm-bindgen-shared",
|
"wasm-bindgen-shared",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "wasm-bindgen-futures"
|
||||||
|
version = "0.4.37"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
"js-sys",
|
||||||
|
"wasm-bindgen",
|
||||||
|
"web-sys",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasm-bindgen-macro"
|
name = "wasm-bindgen-macro"
|
||||||
version = "0.2.87"
|
version = "0.2.87"
|
||||||
@@ -2575,6 +2751,15 @@ version = "0.48.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
|
checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winreg"
|
||||||
|
version = "0.10.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d"
|
||||||
|
dependencies = [
|
||||||
|
"winapi",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wyz"
|
name = "wyz"
|
||||||
version = "0.5.1"
|
version = "0.5.1"
|
||||||
|
|||||||
10
Cargo.toml
10
Cargo.toml
@@ -45,7 +45,7 @@ ctrlc = "3.2.2"
|
|||||||
ordered-float = "2.6.0"
|
ordered-float = "2.6.0"
|
||||||
phf = { version = "0.9", features = ["macros"] }
|
phf = { version = "0.9", features = ["macros"] }
|
||||||
ref_thread_local = "0.0.0"
|
ref_thread_local = "0.0.0"
|
||||||
rug = { version = "1.15.0", optional = true }
|
rug = { path = "../rug", optional = true }
|
||||||
rustyline = "9.0.0"
|
rustyline = "9.0.0"
|
||||||
ring = "0.16.13"
|
ring = "0.16.13"
|
||||||
ripemd160 = "0.8.0"
|
ripemd160 = "0.8.0"
|
||||||
@@ -65,10 +65,14 @@ hyper = { version = "0.14", features = ["full"] }
|
|||||||
hyper-tls = "0.5.0"
|
hyper-tls = "0.5.0"
|
||||||
tokio = { version = "1.24.2", features = ["full"] }
|
tokio = { version = "1.24.2", features = ["full"] }
|
||||||
futures = "0.3"
|
futures = "0.3"
|
||||||
libffi = "3.1.0"
|
|
||||||
libloading = "0.7"
|
libloading = "0.7"
|
||||||
derive_deref = "1.1.1"
|
derive_deref = "1.1.1"
|
||||||
dashu = "0.3.0"
|
http-body-util = "0.1.0-rc.2"
|
||||||
|
bytes = "1"
|
||||||
|
reqwest = { version = "0.11.18", features = ["blocking"] }
|
||||||
|
dashu = { path = "../dashu" }
|
||||||
|
libffi = { path = "../libffi-rs/libffi-rs" }
|
||||||
|
rand = "0.8.5"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
assert_cmd = "1.0.3"
|
assert_cmd = "1.0.3"
|
||||||
|
|||||||
@@ -9,12 +9,11 @@ use crate::targets::QueryInstruction;
|
|||||||
use crate::types::*;
|
use crate::types::*;
|
||||||
|
|
||||||
use crate::parser::ast::*;
|
use crate::parser::ast::*;
|
||||||
use crate::parser::rug::ops::PowAssign;
|
|
||||||
use crate::parser::rug::{Assign};
|
|
||||||
use crate::parser::dashu::{Integer, Rational};
|
use crate::parser::dashu::{Integer, Rational};
|
||||||
|
|
||||||
use crate::machine::machine_errors::*;
|
use crate::machine::machine_errors::*;
|
||||||
|
|
||||||
|
use dashu::base::Abs;
|
||||||
use ordered_float::*;
|
use ordered_float::*;
|
||||||
|
|
||||||
use std::cell::Cell;
|
use std::cell::Cell;
|
||||||
@@ -378,13 +377,11 @@ pub(crate) fn rnd_i<'a>(n: &'a Number, arena: &mut Arena) -> Number {
|
|||||||
if I64_MIN_TO_F <= f && f <= I64_MAX_TO_F {
|
if I64_MIN_TO_F <= f && f <= I64_MAX_TO_F {
|
||||||
fixnum!(Number, f.into_inner() as i64, arena)
|
fixnum!(Number, f.into_inner() as i64, arena)
|
||||||
} else {
|
} else {
|
||||||
Number::Integer(arena_alloc!(Integer::from(f.into_inner()).unwrap(), arena))
|
Number::Integer(arena_alloc!(Integer::from(f.0 as i64), arena))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
&Number::Rational(ref r) => {
|
&Number::Rational(ref r) => {
|
||||||
let r_ref = r.fract_floor_ref();
|
let (mut fract, mut floor) = (r.fract(), r.floor());
|
||||||
let (mut fract, mut floor) = (Rational::from(0), Integer::from(0));
|
|
||||||
(&mut fract, &mut floor).assign(r_ref);
|
|
||||||
|
|
||||||
if let Some(floor) = floor.to_i64() {
|
if let Some(floor) = floor.to_i64() {
|
||||||
fixnum!(Number, floor, arena)
|
fixnum!(Number, floor, arena)
|
||||||
@@ -439,12 +436,12 @@ pub(crate) fn float_fn_to_f(n: i64) -> Result<f64, EvalError> {
|
|||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub(crate) fn float_i_to_f(n: &Integer) -> Result<f64, EvalError> {
|
pub(crate) fn float_i_to_f(n: &Integer) -> Result<f64, EvalError> {
|
||||||
classify_float(n.to_f64())
|
classify_float(n.to_f64().value())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub(crate) fn float_r_to_f(r: &Rational) -> Result<f64, EvalError> {
|
pub(crate) fn float_r_to_f(r: &Rational) -> Result<f64, EvalError> {
|
||||||
classify_float(r.to_f64())
|
classify_float(r.to_f64().value())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
@@ -543,8 +540,8 @@ impl PartialEq for Number {
|
|||||||
(&Number::Fixnum(n1), &Number::Float(n2)) => OrderedFloat(n1.get_num() as f64).eq(&n2),
|
(&Number::Fixnum(n1), &Number::Float(n2)) => OrderedFloat(n1.get_num() as f64).eq(&n2),
|
||||||
(&Number::Float(n1), &Number::Fixnum(n2)) => n1.eq(&OrderedFloat(n2.get_num() as f64)),
|
(&Number::Float(n1), &Number::Fixnum(n2)) => n1.eq(&OrderedFloat(n2.get_num() as f64)),
|
||||||
(&Number::Integer(ref n1), &Number::Integer(ref n2)) => n1.eq(n2),
|
(&Number::Integer(ref n1), &Number::Integer(ref n2)) => n1.eq(n2),
|
||||||
(&Number::Integer(ref n1), Number::Float(n2)) => OrderedFloat(n1.to_f64()).eq(n2),
|
(&Number::Integer(ref n1), Number::Float(n2)) => OrderedFloat(n1.to_f64().value()).eq(n2),
|
||||||
(&Number::Float(n1), &Number::Integer(ref n2)) => n1.eq(&OrderedFloat(n2.to_f64())),
|
(&Number::Float(n1), &Number::Integer(ref n2)) => n1.eq(&OrderedFloat(n2.to_f64().value())),
|
||||||
(&Number::Integer(ref n1), &Number::Rational(ref n2)) => {
|
(&Number::Integer(ref n1), &Number::Rational(ref n2)) => {
|
||||||
#[cfg(feature = "num")]
|
#[cfg(feature = "num")]
|
||||||
{
|
{
|
||||||
@@ -565,8 +562,8 @@ impl PartialEq for Number {
|
|||||||
&**n1 == &**n2
|
&**n1 == &**n2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
(&Number::Rational(ref n1), &Number::Float(n2)) => OrderedFloat(n1.to_f64()).eq(&n2),
|
(&Number::Rational(ref n1), &Number::Float(n2)) => OrderedFloat(n1.to_f64().value()).eq(&n2),
|
||||||
(&Number::Float(n1), &Number::Rational(ref n2)) => n1.eq(&OrderedFloat(n2.to_f64())),
|
(&Number::Float(n1), &Number::Rational(ref n2)) => n1.eq(&OrderedFloat(n2.to_f64().value())),
|
||||||
(&Number::Float(f1), &Number::Float(f2)) => f1.eq(&f2),
|
(&Number::Float(f1), &Number::Float(f2)) => f1.eq(&f2),
|
||||||
(&Number::Rational(ref r1), &Number::Rational(ref r2)) => r1.eq(&r2),
|
(&Number::Rational(ref r1), &Number::Rational(ref r2)) => r1.eq(&r2),
|
||||||
}
|
}
|
||||||
@@ -634,8 +631,8 @@ impl Ord for Number {
|
|||||||
(&Number::Fixnum(n1), &Number::Float(n2)) => OrderedFloat(n1.get_num() as f64).cmp(&n2),
|
(&Number::Fixnum(n1), &Number::Float(n2)) => OrderedFloat(n1.get_num() as f64).cmp(&n2),
|
||||||
(&Number::Float(n1), &Number::Fixnum(n2)) => n1.cmp(&OrderedFloat(n2.get_num() as f64)),
|
(&Number::Float(n1), &Number::Fixnum(n2)) => n1.cmp(&OrderedFloat(n2.get_num() as f64)),
|
||||||
(&Number::Integer(n1), &Number::Integer(n2)) => (*n1).cmp(&*n2),
|
(&Number::Integer(n1), &Number::Integer(n2)) => (*n1).cmp(&*n2),
|
||||||
(&Number::Integer(n1), Number::Float(n2)) => OrderedFloat(n1.to_f64()).cmp(n2),
|
(&Number::Integer(n1), Number::Float(n2)) => OrderedFloat(n1.to_f64().value()).cmp(n2),
|
||||||
(&Number::Float(n1), &Number::Integer(ref n2)) => n1.cmp(&OrderedFloat(n2.to_f64())),
|
(&Number::Float(n1), &Number::Integer(ref n2)) => n1.cmp(&OrderedFloat(n2.to_f64().value())),
|
||||||
(&Number::Integer(n1), &Number::Rational(n2)) => {
|
(&Number::Integer(n1), &Number::Rational(n2)) => {
|
||||||
#[cfg(feature = "num")]
|
#[cfg(feature = "num")]
|
||||||
{
|
{
|
||||||
@@ -656,8 +653,8 @@ impl Ord for Number {
|
|||||||
(&*n1).partial_cmp(&*n2).unwrap_or(Ordering::Less)
|
(&*n1).partial_cmp(&*n2).unwrap_or(Ordering::Less)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
(&Number::Rational(n1), &Number::Float(n2)) => OrderedFloat(n1.to_f64()).cmp(&n2),
|
(&Number::Rational(n1), &Number::Float(n2)) => OrderedFloat(n1.to_f64().value()).cmp(&n2),
|
||||||
(&Number::Float(n1), &Number::Rational(n2)) => n1.cmp(&OrderedFloat(n2.to_f64())),
|
(&Number::Float(n1), &Number::Rational(n2)) => n1.cmp(&OrderedFloat(n2.to_f64().value())),
|
||||||
(&Number::Float(f1), &Number::Float(f2)) => f1.cmp(&f2),
|
(&Number::Float(f1), &Number::Float(f2)) => f1.cmp(&f2),
|
||||||
(&Number::Rational(r1), &Number::Rational(r2)) => (*r1).cmp(&*r2),
|
(&Number::Rational(r1), &Number::Rational(r2)) => (*r1).cmp(&*r2),
|
||||||
}
|
}
|
||||||
@@ -698,7 +695,7 @@ impl TryFrom<HeapCellValue> for Number {
|
|||||||
|
|
||||||
// Computes n ^ power. Ignores the sign of power.
|
// Computes n ^ power. Ignores the sign of power.
|
||||||
pub(crate) fn binary_pow(mut n: Integer, power: &Integer) -> Integer {
|
pub(crate) fn binary_pow(mut n: Integer, power: &Integer) -> Integer {
|
||||||
let mut power = Integer::from(power.abs_ref());
|
let mut power = Integer::from(power.abs());
|
||||||
|
|
||||||
if power == 0 {
|
if power == 0 {
|
||||||
return Integer::from(1);
|
return Integer::from(1);
|
||||||
@@ -711,7 +708,7 @@ pub(crate) fn binary_pow(mut n: Integer, power: &Integer) -> Integer {
|
|||||||
oddand *= &n;
|
oddand *= &n;
|
||||||
}
|
}
|
||||||
|
|
||||||
n.pow_assign(2);
|
n = n.pow(2);
|
||||||
power >>= 1;
|
power >>= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,8 @@ use crate::machine::stack::*;
|
|||||||
use crate::machine::streams::*;
|
use crate::machine::streams::*;
|
||||||
use crate::types::*;
|
use crate::types::*;
|
||||||
|
|
||||||
|
use dashu::base::DivRem;
|
||||||
|
use dashu::base::DivRemEuclid;
|
||||||
use ordered_float::OrderedFloat;
|
use ordered_float::OrderedFloat;
|
||||||
|
|
||||||
use indexmap::IndexMap;
|
use indexmap::IndexMap;
|
||||||
@@ -510,8 +512,8 @@ pub(crate) fn numbervar(offset: &Integer, addr: HeapCellValue) -> Option<String>
|
|||||||
'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||||
];
|
];
|
||||||
|
|
||||||
let i = n.mod_u(26) as usize;
|
let i = n.div_rem_euclid(Integer::from(26)).1.to_f32().value() as usize;
|
||||||
let j = n.div_rem_floor(Integer::from(26));
|
let j = n.div_rem(Integer::from(26));
|
||||||
let j = <(Integer, Integer)>::from(j).0;
|
let j = <(Integer, Integer)>::from(j).0;
|
||||||
|
|
||||||
if j == Integer::from(0) {
|
if j == Integer::from(0) {
|
||||||
@@ -969,14 +971,14 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter> {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
NumberFocus::Denominator(r) => {
|
NumberFocus::Denominator(r) => {
|
||||||
let output_str = format!("{}", r.denom());
|
let output_str = format!("{}", r.denominator());
|
||||||
|
|
||||||
push_space_if_amb!(self, &output_str, {
|
push_space_if_amb!(self, &output_str, {
|
||||||
append_str!(self, &output_str);
|
append_str!(self, &output_str);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
NumberFocus::Numerator(r) => {
|
NumberFocus::Numerator(r) => {
|
||||||
let output_str = format!("{}", r.numer());
|
let output_str = format!("{}", r.numerator());
|
||||||
|
|
||||||
push_space_if_amb!(self, &output_str, {
|
push_space_if_amb!(self, &output_str, {
|
||||||
append_str!(self, &output_str);
|
append_str!(self, &output_str);
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
use dashu::base::Abs;
|
||||||
|
use dashu::base::Gcd;
|
||||||
|
use dashu::integer::IBig;
|
||||||
use divrem::*;
|
use divrem::*;
|
||||||
|
|
||||||
use crate::arena::*;
|
use crate::arena::*;
|
||||||
@@ -159,7 +162,7 @@ pub(crate) fn add(lhs: Number, rhs: Number, arena: &mut Arena) -> Result<Number,
|
|||||||
Ok(Number::Float(add_f(float_fn_to_f(n1.get_num())?, n2)?))
|
Ok(Number::Float(add_f(float_fn_to_f(n1.get_num())?, n2)?))
|
||||||
}
|
}
|
||||||
(Number::Integer(n1), Number::Integer(n2)) => {
|
(Number::Integer(n1), Number::Integer(n2)) => {
|
||||||
Ok(Number::arena_from(Integer::from(&*n1) + &*n2, arena)) // add_i
|
Ok(Number::arena_from(&*n1 + &*n2, arena)) // add_i
|
||||||
}
|
}
|
||||||
(Number::Integer(n1), Number::Float(OrderedFloat(n2)))
|
(Number::Integer(n1), Number::Float(OrderedFloat(n2)))
|
||||||
| (Number::Float(OrderedFloat(n2)), Number::Integer(n1)) => {
|
| (Number::Float(OrderedFloat(n2)), Number::Integer(n1)) => {
|
||||||
@@ -167,7 +170,7 @@ pub(crate) fn add(lhs: Number, rhs: Number, arena: &mut Arena) -> Result<Number,
|
|||||||
}
|
}
|
||||||
(Number::Integer(n1), Number::Rational(n2))
|
(Number::Integer(n1), Number::Rational(n2))
|
||||||
| (Number::Rational(n2), Number::Integer(n1)) => {
|
| (Number::Rational(n2), Number::Integer(n1)) => {
|
||||||
Ok(Number::arena_from(Rational::from(&*n1) + &*n2, arena))
|
Ok(Number::arena_from(&*n1 + &*n2, arena))
|
||||||
}
|
}
|
||||||
(Number::Rational(n1), Number::Float(OrderedFloat(n2)))
|
(Number::Rational(n1), Number::Float(OrderedFloat(n2)))
|
||||||
| (Number::Float(OrderedFloat(n2)), Number::Rational(n1)) => {
|
| (Number::Float(OrderedFloat(n2)), Number::Rational(n1)) => {
|
||||||
@@ -177,7 +180,7 @@ pub(crate) fn add(lhs: Number, rhs: Number, arena: &mut Arena) -> Result<Number,
|
|||||||
Ok(Number::Float(add_f(f1, f2)?))
|
Ok(Number::Float(add_f(f1, f2)?))
|
||||||
}
|
}
|
||||||
(Number::Rational(r1), Number::Rational(r2)) => {
|
(Number::Rational(r1), Number::Rational(r2)) => {
|
||||||
Ok(Number::arena_from(Rational::from(&*r1) + &*r2, arena))
|
Ok(Number::arena_from(&*r1 + &*r2, arena))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -191,9 +194,9 @@ pub(crate) fn neg(n: Number, arena: &mut Arena) -> Number {
|
|||||||
Number::arena_from(-Integer::from(n.get_num()), arena)
|
Number::arena_from(-Integer::from(n.get_num()), arena)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Number::Integer(n) => Number::arena_from(-Integer::from(&*n), arena),
|
Number::Integer(n) => Number::arena_from(-Integer::from(*n.clone()), arena),
|
||||||
Number::Float(OrderedFloat(f)) => Number::Float(OrderedFloat(-f)),
|
Number::Float(OrderedFloat(f)) => Number::Float(OrderedFloat(-f)),
|
||||||
Number::Rational(r) => Number::arena_from(-Rational::from(&*r), arena),
|
Number::Rational(r) => Number::arena_from(-Rational::from(*r), arena),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -203,12 +206,13 @@ pub(crate) fn abs(n: Number, arena: &mut Arena) -> Number {
|
|||||||
if let Some(n) = n.get_num().checked_abs() {
|
if let Some(n) = n.get_num().checked_abs() {
|
||||||
fixnum!(Number, n, arena)
|
fixnum!(Number, n, arena)
|
||||||
} else {
|
} else {
|
||||||
Number::arena_from(Integer::from(n.get_num()).abs(), arena)
|
let arena_int = Integer::from(n.get_num());
|
||||||
|
Number::arena_from(arena_int.abs(), arena)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Number::Integer(n) => Number::arena_from(Integer::from(n.abs_ref()), arena),
|
Number::Integer(n) => Number::arena_from(Integer::from(n.abs()), arena),
|
||||||
Number::Float(f) => Number::Float(f.abs()),
|
Number::Float(f) => Number::Float(f.abs()),
|
||||||
Number::Rational(r) => Number::arena_from(Rational::from(r.abs_ref()), arena),
|
Number::Rational(r) => Number::arena_from(Rational::from(r.abs()), arena),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -247,7 +251,7 @@ pub(crate) fn mul(lhs: Number, rhs: Number, arena: &mut Arena) -> Result<Number,
|
|||||||
Ok(Number::Float(mul_f(float_fn_to_f(n1.get_num())?, n2)?))
|
Ok(Number::Float(mul_f(float_fn_to_f(n1.get_num())?, n2)?))
|
||||||
}
|
}
|
||||||
(Number::Integer(n1), Number::Integer(n2)) => {
|
(Number::Integer(n1), Number::Integer(n2)) => {
|
||||||
Ok(Number::arena_from(Integer::from(&*n1) * &*n2, arena)) // mul_i
|
Ok(Number::arena_from(Integer::from(*n1) * &*n2, arena)) // mul_i
|
||||||
}
|
}
|
||||||
(Number::Integer(n1), Number::Float(OrderedFloat(n2)))
|
(Number::Integer(n1), Number::Float(OrderedFloat(n2)))
|
||||||
| (Number::Float(OrderedFloat(n2)), Number::Integer(n1)) => {
|
| (Number::Float(OrderedFloat(n2)), Number::Integer(n1)) => {
|
||||||
@@ -255,7 +259,7 @@ pub(crate) fn mul(lhs: Number, rhs: Number, arena: &mut Arena) -> Result<Number,
|
|||||||
}
|
}
|
||||||
(Number::Integer(n1), Number::Rational(n2))
|
(Number::Integer(n1), Number::Rational(n2))
|
||||||
| (Number::Rational(n2), Number::Integer(n1)) => {
|
| (Number::Rational(n2), Number::Integer(n1)) => {
|
||||||
Ok(Number::arena_from(Rational::from(&*n1) * &*n2, arena))
|
Ok(Number::arena_from(Rational::from(*n1) * &*n2, arena))
|
||||||
}
|
}
|
||||||
(Number::Rational(n1), Number::Float(OrderedFloat(n2)))
|
(Number::Rational(n1), Number::Float(OrderedFloat(n2)))
|
||||||
| (Number::Float(OrderedFloat(n2)), Number::Rational(n1)) => {
|
| (Number::Float(OrderedFloat(n2)), Number::Rational(n1)) => {
|
||||||
@@ -265,7 +269,7 @@ pub(crate) fn mul(lhs: Number, rhs: Number, arena: &mut Arena) -> Result<Number,
|
|||||||
Ok(Number::Float(mul_f(f1, f2)?))
|
Ok(Number::Float(mul_f(f1, f2)?))
|
||||||
}
|
}
|
||||||
(Number::Rational(r1), Number::Rational(r2)) => {
|
(Number::Rational(r1), Number::Rational(r2)) => {
|
||||||
Ok(Number::arena_from(Rational::from(&*r1) * &*r2, arena))
|
Ok(Number::arena_from(Rational::from(*r1) * &*r2, arena))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -521,7 +525,7 @@ pub fn rational_from_number(
|
|||||||
match n {
|
match n {
|
||||||
Number::Fixnum(n) => Ok(arena_alloc!(Rational::from(n.get_num()), arena)),
|
Number::Fixnum(n) => Ok(arena_alloc!(Rational::from(n.get_num()), arena)),
|
||||||
Number::Rational(r) => Ok(r),
|
Number::Rational(r) => Ok(r),
|
||||||
Number::Float(OrderedFloat(f)) => match Rational::from_f64(f) {
|
Number::Float(OrderedFloat(f)) => match Rational::simplest_from_f64(f) {
|
||||||
Some(r) => Ok(arena_alloc!(r, arena)),
|
Some(r) => Ok(arena_alloc!(r, arena)),
|
||||||
None => Err(Box::new(move |machine_st| {
|
None => Err(Box::new(move |machine_st| {
|
||||||
let instantiation_error = machine_st.instantiation_error();
|
let instantiation_error = machine_st.instantiation_error();
|
||||||
@@ -530,7 +534,7 @@ pub fn rational_from_number(
|
|||||||
machine_st.error_form(instantiation_error, stub)
|
machine_st.error_form(instantiation_error, stub)
|
||||||
})),
|
})),
|
||||||
},
|
},
|
||||||
Number::Integer(n) => Ok(arena_alloc!(Rational::from(&*n), arena)),
|
Number::Integer(n) => Ok(arena_alloc!(Rational::from(*n), arena)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -590,7 +594,7 @@ pub(crate) fn idiv(n1: Number, n2: Number, arena: &mut Arena) -> Result<Number,
|
|||||||
Err(zero_divisor_eval_error(stub_gen))
|
Err(zero_divisor_eval_error(stub_gen))
|
||||||
} else {
|
} else {
|
||||||
Ok(Number::arena_from(
|
Ok(Number::arena_from(
|
||||||
<(Integer, Integer)>::from(n1.div_rem_ref(&*n2)).0,
|
<(Integer, Integer)>::from(n1.div_rem_floor_ref(&*n2)).0,
|
||||||
arena,
|
arena,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
@@ -696,7 +700,7 @@ pub(crate) fn shl(n1: Number, n2: Number, arena: &mut Arena) -> Result<Number, M
|
|||||||
let n1 = Integer::from(n1.get_num());
|
let n1 = Integer::from(n1.get_num());
|
||||||
|
|
||||||
match n2.to_u32() {
|
match n2.to_u32() {
|
||||||
Some(n2) => Ok(Number::arena_from(n1 << n2, arena)),
|
Some(n2) => Ok(Number::arena_from(n1.to_u64().unwrap() << n2, arena)),
|
||||||
_ => {
|
_ => {
|
||||||
Ok(Number::arena_from(n1 << usize::max_value(), arena))
|
Ok(Number::arena_from(n1 << usize::max_value(), arena))
|
||||||
}
|
}
|
||||||
@@ -709,7 +713,7 @@ pub(crate) fn shl(n1: Number, n2: Number, arena: &mut Arena) -> Result<Number, M
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
(Number::Integer(n1), Number::Integer(n2)) => match n2.to_u32() {
|
(Number::Integer(n1), Number::Integer(n2)) => match n2.to_u32() {
|
||||||
Some(n2) => Ok(Number::arena_from(Integer::from(&*n1 << n2), arena)),
|
Some(n2) => Ok(Number::arena_from(Integer::from(n1.to_u64().unwrap() << n2), arena)),
|
||||||
_ => {
|
_ => {
|
||||||
Ok(Number::arena_from(Integer::from(&*n1 << usize::max_value()),arena))
|
Ok(Number::arena_from(Integer::from(&*n1 << usize::max_value()),arena))
|
||||||
}
|
}
|
||||||
@@ -926,18 +930,19 @@ pub(crate) fn gcd(n1: Number, n2: Number, arena: &mut Arena) -> Result<Number, M
|
|||||||
if let Some(result) = isize_gcd(n1_i, n2_i) {
|
if let Some(result) = isize_gcd(n1_i, n2_i) {
|
||||||
Ok(Number::arena_from(result, arena))
|
Ok(Number::arena_from(result, arena))
|
||||||
} else {
|
} else {
|
||||||
|
let value: IBig = Integer::from(n1_i).gcd(&Integer::from(n2_i)).into();
|
||||||
Ok(Number::arena_from(
|
Ok(Number::arena_from(
|
||||||
Integer::from(n1_i).gcd(&Integer::from(n2_i)),
|
value,
|
||||||
arena,
|
arena,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
(Number::Fixnum(n1), Number::Integer(n2)) | (Number::Integer(n2), Number::Fixnum(n1)) => {
|
(Number::Fixnum(n1), Number::Integer(n2)) | (Number::Integer(n2), Number::Fixnum(n1)) => {
|
||||||
let n1 = Integer::from(n1.get_num());
|
let n1 = Integer::from(n1.get_num());
|
||||||
Ok(Number::arena_from(Integer::from(n2.gcd_ref(&n1)), arena))
|
Ok(Number::arena_from(Integer::from(n2.gcd(&n1)), arena))
|
||||||
}
|
}
|
||||||
(Number::Integer(n1), Number::Integer(n2)) => {
|
(Number::Integer(n1), Number::Integer(n2)) => {
|
||||||
Ok(Number::arena_from(Integer::from(n1.gcd_ref(&n2)), arena))
|
Ok(Number::arena_from(Integer::from(n1.gcd(&Integer::from(n2.to_isize().unwrap()))) as IBig, arena))
|
||||||
}
|
}
|
||||||
(Number::Float(f), _) | (_, Number::Float(f)) => {
|
(Number::Float(f), _) | (_, Number::Float(f)) => {
|
||||||
let n = Number::Float(f);
|
let n = Number::Float(f);
|
||||||
|
|||||||
@@ -6,9 +6,10 @@ use crate::machine::loader::*;
|
|||||||
use crate::machine::machine_errors::CompilationError;
|
use crate::machine::machine_errors::CompilationError;
|
||||||
use crate::machine::preprocessor::*;
|
use crate::machine::preprocessor::*;
|
||||||
use crate::parser::ast::*;
|
use crate::parser::ast::*;
|
||||||
use crate::parser::dashu::{Rational, Integer};
|
use crate::parser::dashu::Rational;
|
||||||
use crate::variable_records::*;
|
use crate::variable_records::*;
|
||||||
|
|
||||||
|
use dashu::Integer;
|
||||||
use indexmap::{IndexMap, IndexSet};
|
use indexmap::{IndexMap, IndexSet};
|
||||||
|
|
||||||
use std::cell::Cell;
|
use std::cell::Cell;
|
||||||
|
|||||||
@@ -2540,7 +2540,7 @@ impl Machine {
|
|||||||
self.machine_st.p += 1;
|
self.machine_st.p += 1;
|
||||||
}
|
}
|
||||||
Ok(Number::Rational(n)) => {
|
Ok(Number::Rational(n)) => {
|
||||||
if n.denom() == &1 {
|
if n.denominator().is_one() {
|
||||||
self.machine_st.p += 1;
|
self.machine_st.p += 1;
|
||||||
} else {
|
} else {
|
||||||
self.machine_st.backtrack();
|
self.machine_st.backtrack();
|
||||||
@@ -2559,7 +2559,7 @@ impl Machine {
|
|||||||
self.machine_st.p = self.machine_st.cp;
|
self.machine_st.p = self.machine_st.cp;
|
||||||
}
|
}
|
||||||
Ok(Number::Rational(n)) => {
|
Ok(Number::Rational(n)) => {
|
||||||
if n.denom() == &1 {
|
if n.denominator().is_one() {
|
||||||
self.machine_st.p = self.machine_st.cp;
|
self.machine_st.p = self.machine_st.cp;
|
||||||
} else {
|
} else {
|
||||||
self.machine_st.backtrack();
|
self.machine_st.backtrack();
|
||||||
|
|||||||
@@ -1387,7 +1387,7 @@ impl MachineState {
|
|||||||
Ok(Number::Float(_)) => {
|
Ok(Number::Float(_)) => {
|
||||||
return type_error(arity);
|
return type_error(arity);
|
||||||
}
|
}
|
||||||
Ok(Number::Rational(n)) if n.denom() != &1 => {
|
Ok(Number::Rational(n)) if !n.denominator().is_one() => {
|
||||||
return type_error(arity);
|
return type_error(arity);
|
||||||
}
|
}
|
||||||
Ok(n) if n > MAX_ARITY => {
|
Ok(n) if n > MAX_ARITY => {
|
||||||
@@ -1400,7 +1400,7 @@ impl MachineState {
|
|||||||
let err = self.domain_error(DomainErrorType::NotLessThanZero, n);
|
let err = self.domain_error(DomainErrorType::NotLessThanZero, n);
|
||||||
return Err(self.error_form(err, stub_gen()));
|
return Err(self.error_form(err, stub_gen()));
|
||||||
}
|
}
|
||||||
Ok(Number::Rational(n)) => n.numer().to_i64().unwrap(),
|
Ok(Number::Rational(n)) => n.numerator().to_i64().unwrap(),
|
||||||
Ok(Number::Fixnum(n)) => n.get_num(),
|
Ok(Number::Fixnum(n)) => n.get_num(),
|
||||||
Ok(Number::Integer(n)) => n.to_i64().unwrap(),
|
Ok(Number::Integer(n)) => n.to_i64().unwrap(),
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
|
|||||||
@@ -905,4 +905,4 @@ impl Machine {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
use crate::parser::ast::*;
|
use crate::parser::ast::*;
|
||||||
use crate::parser::parser::*;
|
use crate::parser::parser::*;
|
||||||
|
|
||||||
|
use dashu::integer::UBig;
|
||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
|
|
||||||
use crate::arena::*;
|
use crate::arena::*;
|
||||||
@@ -28,6 +29,8 @@ use crate::parser::dashu::Integer;
|
|||||||
use crate::parser::rug::rand::RandState;
|
use crate::parser::rug::rand::RandState;
|
||||||
use crate::read::*;
|
use crate::read::*;
|
||||||
use crate::types::*;
|
use crate::types::*;
|
||||||
|
use rand::{Rng, SeedableRng};
|
||||||
|
use rand::rngs::StdRng;
|
||||||
|
|
||||||
use ordered_float::OrderedFloat;
|
use ordered_float::OrderedFloat;
|
||||||
|
|
||||||
@@ -36,10 +39,12 @@ use indexmap::IndexSet;
|
|||||||
|
|
||||||
use ref_thread_local::{RefThreadLocal, ref_thread_local};
|
use ref_thread_local::{RefThreadLocal, ref_thread_local};
|
||||||
|
|
||||||
|
use std::borrow::BorrowMut;
|
||||||
use std::cell::Cell;
|
use std::cell::Cell;
|
||||||
use std::cmp::Ordering;
|
use std::cmp::Ordering;
|
||||||
use std::collections::BTreeSet;
|
use std::collections::BTreeSet;
|
||||||
use std::convert::{TryFrom, Infallible};
|
use std::convert::Infallible;
|
||||||
|
use std::convert::TryFrom;
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::ffi::CString;
|
use std::ffi::CString;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
@@ -2727,7 +2732,7 @@ impl Machine {
|
|||||||
// n has already been confirmed as an integer, and
|
// n has already been confirmed as an integer, and
|
||||||
// internally, Rational is assumed reduced, so its denominator
|
// internally, Rational is assumed reduced, so its denominator
|
||||||
// must be 1.
|
// must be 1.
|
||||||
r.numer().to_string()
|
r.numerator().to_string()
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
unreachable!()
|
unreachable!()
|
||||||
@@ -2756,7 +2761,7 @@ impl Machine {
|
|||||||
// n has already been confirmed as an integer, and
|
// n has already been confirmed as an integer, and
|
||||||
// internally, Rational is assumed reduced, so its
|
// internally, Rational is assumed reduced, so its
|
||||||
// denominator must be 1.
|
// denominator must be 1.
|
||||||
r.numer().to_string()
|
r.numerator().to_string()
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
unreachable!()
|
unreachable!()
|
||||||
@@ -4103,10 +4108,25 @@ impl Machine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub(crate) fn maybe(&mut self) {
|
pub(crate) fn maybe(&mut self) {
|
||||||
|
fn generate_random_bits(num_bits: usize) -> u64 {
|
||||||
|
let mut rng = rand::thread_rng();
|
||||||
|
let rand = rng.borrow_mut();
|
||||||
|
let mut random_bits: u64 = 0;
|
||||||
|
|
||||||
|
for _ in 0..num_bits {
|
||||||
|
random_bits <<= 1;
|
||||||
|
|
||||||
|
if rand.gen_bool(0.5) {
|
||||||
|
random_bits |= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
random_bits
|
||||||
|
}
|
||||||
|
|
||||||
let result = {
|
let result = {
|
||||||
let mut rand = RANDOM_STATE.borrow_mut();
|
generate_random_bits(1) == 0
|
||||||
rand.bits(1) == 0
|
|
||||||
};
|
};
|
||||||
|
|
||||||
self.machine_st.fail = result;
|
self.machine_st.fail = result;
|
||||||
@@ -5189,7 +5209,7 @@ impl Machine {
|
|||||||
// n has already been confirmed as an integer, and
|
// n has already been confirmed as an integer, and
|
||||||
// internally, Rational is assumed reduced, so its
|
// internally, Rational is assumed reduced, so its
|
||||||
// denominator must be 1.
|
// denominator must be 1.
|
||||||
r.numer().to_i32().unwrap()
|
r.numerator().to_i32().unwrap()
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
unreachable!()
|
unreachable!()
|
||||||
@@ -5804,12 +5824,20 @@ impl Machine {
|
|||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub(crate) fn set_seed(&mut self) {
|
pub(crate) fn set_seed(&mut self) {
|
||||||
let seed = self.deref_register(1);
|
let seed = self.deref_register(1);
|
||||||
let mut rand = RANDOM_STATE.borrow_mut();
|
|
||||||
|
|
||||||
|
|
||||||
match Number::try_from(seed) {
|
match Number::try_from(seed) {
|
||||||
Ok(Number::Fixnum(n)) => rand.seed(&Integer::from(n)),
|
Ok(Number::Fixnum(n)) => {
|
||||||
Ok(Number::Integer(n)) => rand.seed(&*n),
|
let _: StdRng = SeedableRng::seed_from_u64(Integer::from(n).to_u64().unwrap());
|
||||||
Ok(Number::Rational(n)) if n.denom() == &1 => rand.seed(n.numer()),
|
},
|
||||||
|
Ok(Number::Integer(n)) => {
|
||||||
|
let _: StdRng = SeedableRng::seed_from_u64(n.to_u64().unwrap());
|
||||||
|
},
|
||||||
|
Ok(Number::Rational(n)) => {
|
||||||
|
if n.denominator() == &UBig::from(1 as u32) {
|
||||||
|
let _: StdRng = SeedableRng::seed_from_u64(n.numerator().to_u64().unwrap());
|
||||||
|
}
|
||||||
|
},
|
||||||
_ => {
|
_ => {
|
||||||
self.machine_st.fail = true;
|
self.machine_st.fail = true;
|
||||||
}
|
}
|
||||||
@@ -5823,7 +5851,7 @@ impl Machine {
|
|||||||
let time = match Number::try_from(time) {
|
let time = match Number::try_from(time) {
|
||||||
Ok(Number::Float(n)) => n.into_inner(),
|
Ok(Number::Float(n)) => n.into_inner(),
|
||||||
Ok(Number::Fixnum(n)) => n.get_num() as f64,
|
Ok(Number::Fixnum(n)) => n.get_num() as f64,
|
||||||
Ok(Number::Integer(n)) => n.to_f64(),
|
Ok(Number::Integer(n)) => n.to_f64().value(),
|
||||||
_ => {
|
_ => {
|
||||||
unreachable!()
|
unreachable!()
|
||||||
}
|
}
|
||||||
@@ -7469,7 +7497,7 @@ impl Machine {
|
|||||||
Number::Fixnum(Fixnum::build_with(n.get_num().count_ones() as i64))
|
Number::Fixnum(Fixnum::build_with(n.get_num().count_ones() as i64))
|
||||||
}
|
}
|
||||||
Ok(Number::Integer(n)) => {
|
Ok(Number::Integer(n)) => {
|
||||||
Number::arena_from(n.count_ones().unwrap(), &mut self.machine_st.arena)
|
Number::arena_from(n.count_ones(), &mut self.machine_st.arena)
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
unreachable!()
|
unreachable!()
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ pub use num_rug_adapter as rug;
|
|||||||
|
|
||||||
#[cfg(feature = "rug")]
|
#[cfg(feature = "rug")]
|
||||||
pub use rug;
|
pub use rug;
|
||||||
|
|
||||||
pub use dashu;
|
pub use dashu;
|
||||||
|
|
||||||
// #[macro_use]
|
// #[macro_use]
|
||||||
|
|||||||
@@ -1,13 +1,16 @@
|
|||||||
|
use dashu::Integer;
|
||||||
|
use dashu::Rational;
|
||||||
|
|
||||||
use crate::arena::*;
|
use crate::arena::*;
|
||||||
use crate::atom_table::*;
|
use crate::atom_table::*;
|
||||||
use crate::parser::ast::*;
|
use crate::parser::ast::*;
|
||||||
use crate::parser::char_reader::*;
|
use crate::parser::char_reader::*;
|
||||||
use crate::parser::lexer::*;
|
use crate::parser::lexer::*;
|
||||||
|
|
||||||
use crate::parser::rug::ops::NegAssign;
|
|
||||||
|
|
||||||
use std::cell::Cell;
|
use std::cell::Cell;
|
||||||
use std::mem;
|
use std::mem;
|
||||||
|
use std::ops::Neg;
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, PartialEq)]
|
#[derive(Debug, Clone, Copy, PartialEq)]
|
||||||
enum TokenType {
|
enum TokenType {
|
||||||
@@ -955,9 +958,14 @@ impl<'a, R: CharRead> Parser<'a, R> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn shift_token(&mut self, token: Token, op_dir: &CompositeOpDir) -> Result<(), ParserError> {
|
fn shift_token(&mut self, token: Token, op_dir: &CompositeOpDir) -> Result<(), ParserError> {
|
||||||
fn negate_rc<T: NegAssign>(mut t: TypedArenaPtr<T>) -> TypedArenaPtr<T> {
|
fn negate_int_rc(mut t: TypedArenaPtr<Integer>) -> TypedArenaPtr<Integer> {
|
||||||
(&mut t).neg_assign();
|
let mut data = t.neg();
|
||||||
t
|
TypedArenaPtr::new(&mut data)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn negate_rat_rc(mut t: TypedArenaPtr<Rational>) -> TypedArenaPtr<Rational> {
|
||||||
|
let mut data = t.neg();
|
||||||
|
TypedArenaPtr::new(&mut data)
|
||||||
}
|
}
|
||||||
|
|
||||||
match token {
|
match token {
|
||||||
@@ -965,10 +973,10 @@ impl<'a, R: CharRead> Parser<'a, R> {
|
|||||||
self.negate_number(n, |n| -n, |n, _| Literal::Fixnum(n))
|
self.negate_number(n, |n| -n, |n, _| Literal::Fixnum(n))
|
||||||
}
|
}
|
||||||
Token::Literal(Literal::Integer(n)) => {
|
Token::Literal(Literal::Integer(n)) => {
|
||||||
self.negate_number(n, negate_rc, |n, _| Literal::Integer(n))
|
self.negate_number(n, negate_int_rc, |n, _| Literal::Integer(n))
|
||||||
}
|
}
|
||||||
Token::Literal(Literal::Rational(n)) => {
|
Token::Literal(Literal::Rational(n)) => {
|
||||||
self.negate_number(n, negate_rc, |r, _| Literal::Rational(r))
|
self.negate_number(n, negate_rat_rc, |r, _| Literal::Rational(r))
|
||||||
}
|
}
|
||||||
Token::Literal(Literal::Float(n)) => self.negate_number(
|
Token::Literal(Literal::Float(n)) => self.negate_number(
|
||||||
**n.as_ptr(),
|
**n.as_ptr(),
|
||||||
|
|||||||
Reference in New Issue
Block a user