Nushellを電卓として使う際のTips集
しばたです。
以前に「PowerShellを電卓として使う際のTips集」という記事を書きました。
現在Nushellの利用を検証中で、Nushellでも同様のことが可能なので今回記事にしました。
はじめに
Nushell as a 電卓
NushellもPowerShell同様にコンソール上で直接計算を記述できるシェルです。
(1 + 2) * 3 / 4
PowerShellと異なる点として、Nushellでは演算子は必ずスペースで区切る必要があり、以下の様にスペースを入れない場合はエラーになります。
# スペースを入れないとエラーになる
(1+2)*3/4
~> (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) |
演算の優先順位を明示する場合はかっこ(
、)
で括ってください。
~> (1 + 2) * 3 / 4
2.25
2. 数値型
Nushellでは文字列以外に幾つかの型が定義されています。
その中で数値に関連するものとしては整数を表現するint
型と小数を表現するfloat
型があります。
int
型は内部的にはRustのi64
であり64bitの整数となります。
# 整数は 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
と等価になっていました。
# 小数は 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
コマンドでは小数は切り捨てられます。
# into int コマンドでは小数切り捨て
~> 123.45 | into int
123
各種計算を行うmath
コマンドではそれぞれ、
math ceil
: 切り上げmath round
: 四捨五入math floor
: 切り捨て
となります。
# 切り上げ
~> 12.1 | math ceil
13
# 四捨五入
~> 12.5 | math round
13
# 切り捨て
~> 12.9 | math floor
12
4. 数値計算コマンド
数値計算には前述のmath
コマンドが使えます。
これらのコマンド群の選定理由については良くわかりませんでしたが、なんとなく三角関数が多い印象です。
# 標準偏差をもとめる math stddev コマンド
~> [1 2 3 4 5] | math stddev
1.4142135623730951
5. 基数変換
Nushellでは数値に対して以下の接頭語が使える様です。
0x : 16進数
0o : 8進数
0b : 2進数
ドキュメント上は文字列中での利用を想定している雰囲気なのですが、単純な接頭語として利用してもいい感じに解釈してくれました。
自動的に10進数に変換して扱ってくれます。
# 16進 → 10進
~> 0xffff
65535
# 8進 → 10進
~> 0o100
64
# 2進 → 10進
~> 0b1000
8
# 演算も可能
~> 0xffff + 0o100 + 0b1000
65607
同等の処理はinto int
コマンドを使っても可能です。
# --radix パラメーターで元の基数を指定
~> '101010' | into int --radix 2
42
~> 'FFFF' | into int --radix 16
65535
10進数から他の基数への変換処理は無い様です。
6. カスタムコマンド
PowerShell同様に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の扱いがおかしかったので...)
# 実行結果
~> 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 │
╰────┴─────────────╯
この他にもいくつかサンプルがあるので参考にすると良いでしょう。
- nu_scripts : math_functions.nu (※動作未確認)
加えてカスタムコマンドの他にプラグインの仕組みもあり好きな言語[1]で処理を書くことも可能です。
ただし、プラグインの仕組みはまだまだ破壊的変更が入りそうな雰囲気なので覚悟の上利用してください。
最後に
以上となります。
本日時点のNushellにおける数値計算まわりのTipsをまとめてみました。
時間が経てば新しい機能が増えたり仕様が変わっていたりする可能性は多分にあるのですが、とりあえず本日時点ではこんな感じです。
本日時点ではRustとPythonの例があります ↩︎