Upgrade to Pro — share decks privately, control downloads, hide ads and more …

dentaku - Ruby製の電卓CLI / dentaku - A Ruby CLI Ca...

Avatar for hogelog hogelog
February 12, 2026

dentaku - Ruby製の電卓CLI / dentaku - A Ruby CLI Calculator

roppongi.rb #39 で話したRuby製電卓CLIアプリの話

Avatar for hogelog

hogelog

February 12, 2026
Tweet

More Decks by hogelog

Other Decks in Technology

Transcript

  1. 自己紹介 hogelog (GitHub, X, …) STORES VPoE We are hiring,

    hiring, HIRING!!! https://jobs.st.inc/ プログラミングやRubyが割と好きです
  2. dentakuの概要 Ruby 3.3+で実装 GitHubで公開中 prism, reline, bigdecimalを利用 標準ライブラリのみ利用 irb だと

    dentaku - ターミナルで動く電卓 1 $ dentak 2 dentaku> 1000 * 0.08 3 => 80.0 4 dentaku> 0.1 + 0.2 5 => 0.3 # 正しく0.3 になる 1 $ irb 2 irb(main):001> 0.1 + 0.2 3 => 0.30000000000000004
  3. 主な機能 基本的な計算 + , - , * , / 括弧のサポート

    -(1+1) などの記法に対応 数字の表示 1000 | comma でカンマ区切り $1,234.56 , ¥1,234 形式の入力に対 応 通貨の表示・変換 1000 | usd → $1,000 1000 | jpy → ¥1,000 100 | usdtojpy → ¥15,000 その他の機能 入力履歴の保存 計算結果のコピー シンタックスハイライト
  4. eval()を使わない実装 Prismでパースして明示的に評価 eval() は任意のコード実行が可能なため回避 1 def eval_node(node) 2 case node

    3 when Prism::IntegerNode 4 BigDecimal(node.value) 5 when Prism::FloatNode 6 BigDecimal(node.value) 7 when Prism::CallNode 8 left = eval_node(node.receiver) 9 right = eval_node(node.arguments.arguments[0]) 10 case node.name 11 when :+ then left + right 12 when :- then left - right 13 when :* then left * right 14 when :/ then left / right 15 end 16 end 17 end
  5. BigDecimalを利用 BigDecimalの場合 Floatの場合 1 0.1 + 0.2 # => 0.30000000000000004

    1 BigDecimal("0.1") + BigDecimal("0.2") # => 0.3 1 dentaku> 0.1 + 0.2 2 => 0.3 # 期待通りの結果
  6. パイプによる連鎖 | で区切って順番に処理 | で計算を連鎖可能 1 dentaku> 100 * 5

    2 => 500 3 dentaku> 100 * 5 | _1 + 10 4 => 510 # 500 + 10 5 6 dentaku> 1000 | usd 7 => $1,000 8 dentaku> 1000 | usdtojpy 9 => ¥150,000
  7. クリップボードコピー pbcopyを利用 結果をクリップボードにコピー(macOSのみ) 1 dentaku> 100 * 5 | copy

    2 => 500 3 # クリップボードに "500" がコピーされる 1 def copy(value) 2 IO.popen("pbcopy", "w") { |io| io.puts value } 3 value 4 end