Nushellを電卓として使う際のTips集

Nushellを電卓として使う際のTips集

Clock Icon2024.07.13

しばたです。

以前に「PowerShellを電卓として使う際のTips集」という記事を書きました。

https://dev.classmethod.jp/articles/powershell-as-a-calc-tips/

現在Nushellの利用を検証中で、Nushellでも同様のことが可能なので今回記事にしました。

https://www.nushell.sh/

はじめに

Nushell as a 電卓

NushellもPowerShell同様にコンソール上で直接計算を記述できるシェルです。

Nushell
(1 + 2) * 3 / 4

nushell-as-a-calc-tips-01

PowerShellと異なる点として、Nushellでは演算子は必ずスペースで区切る必要があり、以下の様にスペースを入れない場合はエラーになります。

Nushell
# スペースを入れないとエラーになる
(1+2)*3/4

nushell-as-a-calc-tips-02

Nushell
~> (1+2)*3/4
Error: nu::parser::unclosed_delimiter

  × Unclosed delimiter.
   ╭─[entry #24:1:10]
 1 │ (1+2)*3/4
   ╰────

Nushellを電卓として使う際のTips集

1. 基本的な演算子

演算子 用例 内容
+ 1 + 2 加算、プラス
- 1 - 2 減算、マイナス
* 1 * 2 乗算
/ 10 / 2 除算
** 2 ** 10 累乗
mod 10 mod 3 余剰
// 10 // 3 切り捨て除算 (floor division)

演算の優先順位を明示する場合はかっこ()で括ってください。

Nushell
~> (1 + 2) * 3 / 4
2.25

2. 数値型

Nushellでは文字列以外に幾つかの型が定義されています。

その中で数値に関連するものとしては整数を表現するint型と小数を表現するfloat型があります。

int型は内部的にはRustのi64であり64bitの整数となります。

Nushell
# 整数は int型 (i64)
~> 123 | describe
int

# 64bitを超える値になるとオバーフローエラー
~> 9223372036854775807 | describe
int

~> 9223372036854775807 + 1
Error: nu::shell::operator_overflow

  × Operator overflow.
   ╭─[entry #16:1:1]
 1 │ 9223372036854775807 + 1
   · ───────────┬───────────
   ·            ╰── add operation overflowed
   ╰────
  help: Consider using floating point values for increased range by promoting operand with 'into float'. Note: float
        has reduced precision!

float型は内部的にはRustのf64でありこちらも64bitの浮動小数点型となります。
float型の最大値を超えるとinf値となり、これはRustのf64::INFINITYと等価になっていました。

Nushell
# 小数は float型 (f64)
~> 123.45 | describe
float

# 64bitを超える値になると inf 表記になる
~> 1.7976931348623157E+308
179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

~> 1.7976931348623157E+309
inf

~> 1.7976931348623157E+309 * -1
-inf

# inf もfloat型の一つの値として表現される
~> inf | describe
float

3. 丸め、0除算

PowerShell(.NET)とは異なり、Nushellには暗黙の丸めといったものは無く処理に応じて変わります。

int型への型変換に相当するinto intコマンドでは小数は切り捨てられます。

Nushell
# into int コマンドでは小数切り捨て
~> 123.45 | into int
123

各種計算を行うmathコマンドではそれぞれ、

  • math ceil : 切り上げ
  • math round : 四捨五入
  • math floor : 切り捨て

となります。

Nushell
# 切り上げ
~> 12.1 | math ceil
13

# 四捨五入
~> 12.5 | math round
13

# 切り捨て
~> 12.9 | math floor
12

4. 数値計算コマンド

数値計算には前述のmathコマンドが使えます。

これらのコマンド群の選定理由については良くわかりませんでしたが、なんとなく三角関数が多い印象です。

Nushell
# 標準偏差をもとめる math stddev コマンド
~> [1 2 3 4 5] | math stddev
1.4142135623730951

5. 基数変換

Nushellでは数値に対して以下の接頭語が使える様です。

  • 0x : 16進数
  • 0o : 8進数
  • 0b : 2進数

ドキュメント上は文字列中での利用を想定している雰囲気なのですが、単純な接頭語として利用してもいい感じに解釈してくれました。
自動的に10進数に変換して扱ってくれます。

Nushell
# 16進 → 10進
~> 0xffff
65535

# 8進 → 10進
~> 0o100
64

# 2進 → 10進
~> 0b1000
8

# 演算も可能
~> 0xffff + 0o100 + 0b1000
65607

同等の処理はinto intコマンドを使っても可能です。

Nushell
# --radix パラメーターで元の基数を指定
~> '101010' | into int --radix 2
42

~> 'FFFF' | into int --radix 16
65535

10進数から他の基数への変換処理は無い様です。

6. カスタムコマンド

PowerShell同様にNushellもカスタムコマンドの形で独自関数を自作することができます。
必要があれば独自に計算処理を実装すると良いでしょう。

Nushell
# フィボナッチ数を計算するカスタムコマンド
def fib [n: int] {
  mut a = 1
  mut b = 0
  for _ in (seq 1 1 $n) {
    let c = $a + $b
    $a = $b
    $b = $c
  }
  $b
}
  • fibonacci.nu をベースに修正 (n=0,1の扱いがおかしかったので...)
Nushell
# 実行結果
~> 0..50 | each { |n| fib $n }
╭────┬─────────────╮
│  0 │           0 │
│  1 │           1 │
│  2 │           1 │
│  3 │           2 │
│  4 │           3 │
│  5 │           5 │
│  6 │           8 │
│  7 │          13 │
│  8 │          21 │
│  9 │          34 │
│ 10 │          55 │
│ 11 │          89 │
│ 12 │         144 │
│ 13 │         233 │
│ 14 │         377 │
│ 15 │         610 │
│ 16 │         987 │
│ 17 │        1597 │
│ 18 │        2584 │
│ 19 │        4181 │
│ 20 │        6765 │
│ 21 │       10946 │
│ 22 │       17711 │
│ 23 │       28657 │
│ 24 │       46368 │
│ 25 │       75025 │
│ 26 │      121393 │
│ 27 │      196418 │
│ 28 │      317811 │
│ 29 │      514229 │
│ 30 │      832040 │
│ 31 │     1346269 │
│ 32 │     2178309 │
│ 33 │     3524578 │
│ 34 │     5702887 │
│ 35 │     9227465 │
│ 36 │    14930352 │
│ 37 │    24157817 │
│ 38 │    39088169 │
│ 39 │    63245986 │
│ 40 │   102334155 │
│ 41 │   165580141 │
│ 42 │   267914296 │
│ 43 │   433494437 │
│ 44 │   701408733 │
│ 45 │  1134903170 │
│ 46 │  1836311903 │
│ 47 │  2971215073 │
│ 48 │  4807526976 │
│ 49 │  7778742049 │
│ 50 │ 12586269025 │
╰────┴─────────────╯

この他にもいくつかサンプルがあるので参考にすると良いでしょう。

加えてカスタムコマンドの他にプラグインの仕組みもあり好きな言語[1]で処理を書くことも可能です。
ただし、プラグインの仕組みはまだまだ破壊的変更が入りそうな雰囲気なので覚悟の上利用してください。

最後に

以上となります。

本日時点のNushellにおける数値計算まわりのTipsをまとめてみました。
時間が経てば新しい機能が増えたり仕様が変わっていたりする可能性は多分にあるのですが、とりあえず本日時点ではこんな感じです。

脚注
  1. 本日時点ではRustとPythonの例があります ↩︎

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.