Windows標準の電卓アプリを意地でも使わない(その3)

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、Rubyirbだ。

これらのうち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以外で手元にある電卓の代用になりそうな対話型シェルの類は、

……と、あまりメジャーではない代物ばかり。

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を使っている。人生、何がどうなるのか分からないものだなあ。

*1:どこかで見たことがある内容だな

*2:gawkがそうだったので