nushell/crates
Ian Manske 9f09930834
Div, mod, and floor div overhaul (#14157)
# Description
Dividing two ints can currently return either an int or a float. Not
having a single return type for an operation between two types seems
problematic. Additionally, the type signature for division says that
dividing two ints returns only an int which does not match the current
implementation (it can also return a float). This PR changes division
between almost all types to return a float (except for `filesize /
number` or `duration / number`, since there are no float representations
for these types).

Currently, floor division between certain types is not implemented even
though the type signature allows it. Also, the current implementation of
floor division uses a combination of clamping and flooring rather than
simply performing floor division which this PR fixes. Additionally, the
signature was changed so that `int // float`, `float // int`, and `float
// float` now return float instead of int. This matches the automatic
float promotion in the rest of the operators (as well as how Python does
floor division which I think is the original inspiration).

Since regular division has always returned fractional values (and now
returns a float to reflect that), `mod` is now defined in terms of floor
division. That is, `D // d = q`, `D mod d = r`, and `D = d * q + r `.
This is just like the `%` operator in Python, which is also based off
floor division (at least for ints and floats). Additionally,
implementations missing from `mod`'s current type signature have been
added (`duration mod int` and `duration mod float`).

This PR also overhauls the overflow checking and errors for div, mod,
and floor div. If an operation overflows, it will now cause an error.

# User-Facing Changes
- Div now returns a float in most cases.
- Floor division now actually does floor division.
- Floor division now does automatic float promotion, returning a float
in more instances.
- Floor division now actually allows division with filesize and
durations as its type signature claimed.
- Mod is now defined and implemented in terms of floor division rather
than truncating division.
- Mod now actually allows filesize and durations as its type signature
claimed.
- Div, mod, and floor div now all have proper overflow checks.

## Examples

When the divisor and the dividend have the same sign, the quotient and
remainder will be the same as before. (Except that this PR will give
more accurate results, since it does not do an intermediate float
conversion). If the signs of the divisor and dividend are different,
then the results will be different, or rather actually correct.

Before:

```nu
let q = 8 // -3 # -3
let r = 8 mod -3 # 2
8 == $q * -3 + $r # false
```

After:

```nu
let q = 8 // -3 # -3
let r = 8 mod -3 # -1
8 == $q * -3 + $r # true
```


Before:

```nu
let q = -8 // 3 # -3
let r = -8 mod 3 # -2
-8 == $q * 3 + $r # false
```

After:

```nu
let q = -8 // 3 # -3
let r = -8 mod 3 # 1
-8 == $q * 3 + $r # true
```

# Tests + Formatting
Added a few tests.

# After Submitting
Probably update the docs.
2024-11-04 18:03:48 +01:00
..
nu_plugin_custom_values Bump to 0.99.2 (#14136) 2024-10-20 23:12:41 +02:00
nu_plugin_example Bump to 0.99.2 (#14136) 2024-10-20 23:12:41 +02:00
nu_plugin_formats Bump to 0.99.2 (#14136) 2024-10-20 23:12:41 +02:00
nu_plugin_gstat Bump to 0.99.2 (#14136) 2024-10-20 23:12:41 +02:00
nu_plugin_inc Bump to 0.99.2 (#14136) 2024-10-20 23:12:41 +02:00
nu_plugin_nu_example Bump to 0.99.2 (#14136) 2024-10-20 23:12:41 +02:00
nu_plugin_polars Upgrade to polars 0.43 (#14148) 2024-10-23 19:14:24 +02:00
nu_plugin_python Bump to 0.99.2 (#14136) 2024-10-20 23:12:41 +02:00
nu_plugin_query Bump to 0.99.2 (#14136) 2024-10-20 23:12:41 +02:00
nu_plugin_stress_internals Bump to 0.99.2 (#14136) 2024-10-20 23:12:41 +02:00
nu-cli Allow using function keys F21-F35 for keybindings (#14201) 2024-10-30 12:22:47 +01:00
nu-cmd-base Bump to 0.99.2 (#14136) 2024-10-20 23:12:41 +02:00
nu-cmd-extra Bump to 0.99.2 (#14136) 2024-10-20 23:12:41 +02:00
nu-cmd-lang add rendered and json error messages in try/catch (#14082) 2024-10-20 23:14:11 +02:00
nu-cmd-plugin Make plugin list read state from plugin registry file as well (#14085) 2024-10-20 23:12:57 +02:00
nu-color-config Improve CellPath display output (#14197) 2024-11-02 10:28:10 -05:00
nu-command Div, mod, and floor div overhaul (#14157) 2024-11-04 18:03:48 +01:00
nu-derive-value Bump to 0.99.2 (#14136) 2024-10-20 23:12:41 +02:00
nu-engine add command_type to help (#14165) 2024-10-24 19:06:49 +02:00
nu-explore Drop once_cell dependency (#14198) 2024-10-29 17:33:46 +01:00
nu-glob Bump to 0.99.2 (#14136) 2024-10-20 23:12:41 +02:00
nu-json Bump fancy-regex from 0.13.0 to 0.14.0 (#14207) 2024-10-30 10:51:21 +08:00
nu-lsp Fix LSP non-ascii characters offset issues. (#14002) 2024-10-29 06:35:37 -05:00
nu-parser Div, mod, and floor div overhaul (#14157) 2024-11-04 18:03:48 +01:00
nu-path Bump to 0.99.2 (#14136) 2024-10-20 23:12:41 +02:00
nu-plugin Update to rust 1.80.1 (#14106) 2024-10-20 23:14:11 +02:00
nu-plugin-core Bump to 0.99.2 (#14136) 2024-10-20 23:12:41 +02:00
nu-plugin-engine Bump to 0.99.2 (#14136) 2024-10-20 23:12:41 +02:00
nu-plugin-protocol Bump to 0.99.2 (#14136) 2024-10-20 23:12:41 +02:00
nu-plugin-test-support Bump to 0.99.2 (#14136) 2024-10-20 23:12:41 +02:00
nu-pretty-hex Bump to 0.99.2 (#14136) 2024-10-20 23:12:41 +02:00
nu-protocol Div, mod, and floor div overhaul (#14157) 2024-11-04 18:03:48 +01:00
nu-std add like and not-like operators as synonyms for the regex operators =~ and !~ (#14072) 2024-10-20 23:12:57 +02:00
nu-system Drop once_cell dependency (#14198) 2024-10-29 17:33:46 +01:00
nu-table Drop once_cell dependency (#14198) 2024-10-29 17:33:46 +01:00
nu-term-grid Bump to 0.99.2 (#14136) 2024-10-20 23:12:41 +02:00
nu-test-support Fix quoting in to nuon and refactor quoting functions (#14180) 2024-10-29 07:43:26 -05:00
nu-utils Improve CellPath display output (#14197) 2024-11-02 10:28:10 -05:00
nuon Improve CellPath display output (#14197) 2024-11-02 10:28:10 -05:00
README.md Remove old nushell/merge engine-q 2022-02-07 14:54:06 -05:00

Nushell core libraries and plugins

These sub-crates form both the foundation for Nu and a set of plugins which extend Nu with additional functionality.

Foundational libraries are split into two kinds of crates:

  • Core crates - those crates that work together to build the Nushell language engine
  • Support crates - a set of crates that support the engine with additional features like JSON support, ANSI support, and more.

Plugins are likewise also split into two types:

  • Core plugins - plugins that provide part of the default experience of Nu, including access to the system properties, processes, and web-connectivity features.
  • Extra plugins - these plugins run a wide range of different capabilities like working with different file types, charting, viewing binary data, and more.