id:eel3:20090301:1235909263 や id:eel3:20090302:1235922399 で書いた方法は、さくっと簡単に計算する場合に向いている。でも色々と試行錯誤しながら計算する場合は対話型のツールの方が使いやすいと思う。
対話的に計算するツールで昔からあるものといえばbcだ。C言語に似た構文を持っていたり関数を定義できたりと、そこそこ高機能な言語処理系なbcだけど、私は殆ど使いこなせないまま他のツールに乗り換えてしまった。まあ個人的には「対話的に計算できる」という点だけでも十分だったけど。
$ bc bc 1.06 Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. 1 + 1 2 5 - 10 -5 6 * 3 18 n = 5040 + 3990 + 2310; n 11340 3 / 2 1 scale 0 scale = 1 3 / 2 1.5 scale = 2 3 / 2 1.50 scale = 0 ibase 10 ibase = 16; ibase 16 FF 255 A 10 ibase = A; ibase 10 ibase = 2; ibase 2 101 5 1010 10 ibase = 1010; ibase 10 101 101 define d (x) { return (x*2); } d (2) 4 d (9) 18 quit $
対話的といえば、一般的なスクリプト言語でも対話環境が用意されている場合があって、ちょっとした電卓代わりに使える。例えばPythonの組み込み対話型シェルやPerlのperlsh、Rubyのirbだ。
これらのうちirbしか触ったことがないのだけど、rubyの言語環境をそのまま使えるというメリットは大きいように感じる。rubyの場合、整数はFixnumとBignumの間で自動的に変換してくれるのも利点かもしれない。
$ irb irb(main):001:0> 1 + 1 => 2 irb(main):002:0> 5 - 10 => -5 irb(main):003:0> 6 * 3 => 18 irb(main):004:0> n = 5040 + 3990 + 2310 => 11340 irb(main):005:0> n => 11340 irb(main):006:0> 3 / 2 => 1 irb(main):007:0> 3.0 / 2 => 1.5 irb(main):008:0> 3.quo(2) => 1.5 irb(main):009:0> 0xFF => 255 irb(main):010:0> 0xA => 10 irb(main):011:0> 0b101 => 5 irb(main):012:0> 0b1010 => 10 irb(main):013:0> def dbl(num) irb(main):014:1> num*2 irb(main):015:1> end => nil irb(main):016:0> dbl(2) => 4 irb(main):017:0> dbl(9) => 18 irb(main):018:0> exit $
ちなみにirb以外で手元にある電卓の代用になりそうな対話型シェルの類は、
- SpiderMonkeyのスタンドアロン用インタプリタ(趣味で自前でビルド)
- WSHのラッパーのijs.js(ネットからコピペして個人的に使用)
- Scheme処理系のSCMのWindows用バイナリ
- Scheme処理系のGaucheのWindows用バイナリ(実験版)
- Common Lisp処理系のCLISP for Win32 日本語(SLIME + 各種ライブラリ + LTK ごった煮版)
……と、あまりメジャーではない代物ばかり。
JavaScriptは有名だけど、JavaScriptでコンソールアプリ(というかフィルタ)を書けないかものかと考える人は少数派のはず。SchemeというかLispはここ最近再注目されてきている気がするけどやはりマイナー感があるし、何よりCLISP以外は「Windows向け処理系が色々あるのに、よりによってこれなの?」と言われそうなチョイスかもしれない。
まあそれでも「言語処理系を電卓代わりに使うことでその言語に慣れよう作戦」とか、よいかもしれない*1。
$ gosh gosh> (+ 1 1) 2 gosh> (- 5 10) -5 gosh> (* 6 3) 18 gosh> (define n (+ 5040 3990 2310)) n gosh> n 11340 gosh> (/ 3 2) 3/2 gosh> (/ 3.0 2) 1.5 gosh> (/. 3 2) 1.5 gosh> #xFF 255 gosh> #xff 255 gosh> #xa 10 gosh> #b101 5 gosh> #b1010 10 gosh> (define (dbl n) (* n 2)) dbl gosh> dbl #<closure dbl> gosh> (dbl 2) 4 gosh> (dbl 9) 18 gosh> (exit) $
一番書きなれている言語はC言語なので、慣れればC言語に似ているbcが使いやすいと感じるようになるかと思っていたのだが*2、現実にはirbかgoshを使っている。人生、何がどうなるのか分からないものだなあ。