いい電卓

自作電卓のデバッグに協力してもらうページ。 → BBS


画面は開発中のものです。

Windows付属の電卓を置き換える事を目標にしている高性能(になる予定)数式電卓です。

EOFile Win2000 ver. 同様、無意味に、シングルプロセス、マルチGUIスレッド、フルUnicodeで動作します。
9x/Meでは動作しません。
壁紙(スキンって言うの?)を変える事ができます。(無駄機能)
Windows付属の電卓の歯痒い点である、全面表示、省スペースモードをサポート。
静的型(多重継承有り)、遅延評価をサポートしているミニ関数型言語です。
Integer、Boolean、Real、Complex、Letterなどの型があります。配列も実装。集合なども追加するつもり。 OrdinalやAny等の抽象型もあります。
前置記法、中置記法、後置記法(逆ポーランド記法)の切り替えをサポート。
dllにより、関数の追加が可能です。
わざわざdllを書かなくても、自身で関数を記述できるように…なったらいいな。

Windows付属の電卓に比べて、精度で劣ります。 あっちはどうやらBCDを用いているのに対し、これは最大で18桁の浮動小数点でしかありません。 整数など普通の32ビットInteger扱いだったりして。64ビットにしとけば良かったかな?

…関数型言語の自己満足インタプリタ作って遊んでいるだけとも言う。 ファイラーはバグ出すと致命的なんで、気が重くて開発があまり進まない。 電卓なら金銭の計算でもやらない限り被害は無いし~。 動作する事が第一義なので、当面効率は度外視。

preview version

download preview version

かなりちゃんとしたものができてきてしまったので、 そのうち細部を詰めて安定したらVectorにも上げます。現在はβ版ということで。
試用した場合、バグ報告を行なう義務を課します。必須です。強制です。はい。 仕様が揺れているうちに僕がイイと思いそうな機能を挙げておくといいことあるかも。

仕様とか(ヘルプファイルができるまでの暫定メモ)

コマンドラインオプション

-INIREADONLY 終了時*.iniを書かない(CD起動等を想定)

*.iniは、最初の窓が開いた時点で読み、最後の窓が閉じた時点で書きます。

壁紙のファイル名がタイトルの後に続きます。(無駄機能)

型

  < が派生を表すとして、こんな感じ。

  全部   Any
  序数   Ordinal < Any
  複素数 Complex < Any
  実数   Real < Complex
  整数   Integer < Ordinal, Real
  真偽値 Boolean < Ordinal
  文字   Letter < Ordinal
  配列   [T] < [T's super class], Any

演算子

↑優先順位高い
neg not 関数呼 リテラル 括弧類
メソッド呼 (*)
^
* / div mod and as(*)
+ - or xor &
= /= > < >= <= imp is(*)
? :=
;
↓優先順位低い
(*)は、まだ実装されてません。

中置記法の単項マイナスは、
整数や実数の定数の直前に書いた場合は定数の一部、
それ以外は自動的にnegに変換。

divは整数商、modは整数余、
負の場合も連続して扱うよういじってます。
 1 div 3 =  0;  1 mod 3 = 1
 0 div 3 =  0;  0 mod 3 = 0
-1 div 3 = -1; -1 mod 3 = 2 (Pascalだと -1 div 3 = 0; -1 mod 3 = -1)

impは論理学の→演算子。A imp B = not A or B

; は演算順序を規定。最後の式の値が採用される。1 ; 2 = 2

前置、後置の時は、優先順位は、; とそれ以外の2段階だけです。
(前置、後置のときも;だけは中置で書く)

配列

[1, 2] とか書けます。
型は、中身の共通のスーパークラスの配列になります。

sum [1,2,3,4] = 10
average [1,2,3,4] = 2.5

文字列もLetterの配列です。['A', 'B', 'C'] = "ABC"

配列は&で結合できます。

分岐

  前置 ? B T ? B T F
  中置 B ? T B ? T F (ex. (2 > 3 ? 4 5) = 5)
  後置 F T B ? T B ? (前置の完全に逆)

進数#数値#、2進と16進だけ有効

2進数 2#01111# = 15
16進数 16#0ff# = 255

最上位ビットが立っている時がマイナス(なので注意)

2#1# = 2#1111# = 16#f# = 16#ff# = -1

束縛

変数のようなものだが書換不可。# a = 2; a * 3 
:= は後置の時は =: 

# z := x + y; z * x
x y + =: # z; z x *

---- 後置記法での束縛に対するメモ ----

(# x := 1) + x はエラー。+演算子が左を先に評価する保証は無い。
1 =: # x x + も同様にエラーにしなければいけないが…難しい。

真面目にやるなら関数の引数に使われたということが判明した時点で、
改めて参照のチェックだが、やってられねーので、文法を利用した手抜き。

前の束縛を引き続いて使えるのは、A ; B だけ。
続けてPushした場合、前の項での束縛は消せる。

それよりも?で逆方向の参照が可能な方が自然なのが頭痛だ…不可能っぽい。
関数か束縛かで取る引数の数すら変わり、一意に構文解析できない。

このせいで、(# x := func) > 0 ? x 0 という事すらできなくなってる。
# x := func; x > 0 ? x 0 にしないと駄目。

後置の?を条件を後に書くようにしたのが間違いか…
でも C T F ? だと連鎖が上手く書けないからなあ。C1 T1 C2 T2 ? ? になってしまう。

---- 以下夢想 ----

メソッドの予定

PI .sin .power 5 .cos …とか書けてもいいな
[1, 2, 3] .At 2 = 2 …とか

集合の予定(中身はOrdinal限定、かな)

1 & {1, 2, 3} = True …とか
{1, 2} or {2, 3} = {1, 2, 3} …とか

[1..3] = [1, 2, 3] …とか
{1..3} = {1, 2, 3} …とか

例外的に配列と集合から要素を取り出す関数の型は総称的にしないと…

関数定義とかの予定。関数内関数が作れたら理想なのだが、賢く諦めておく

Max X: Integer Y: Integer -> Integer = x > y ? x y ,

引数を与えなければ高階関数扱い…理想だな

Integrate L: Real H: Real F: (Real -> Real) -> Real = ... ,

Integrate 0 1 (Sin)
Integrate 0 1 (# X: Real -> Real = Sin X + Cos X,)

最終的にはこんなソースコードが実行できたりして(ぉ

Max xs: [Integer] -> Integer = (xs = [])? 0 
    (Length xs = 1) ? xs.First
    (Length xs = 2) ? ((xs.at 0 > xs.at 1) ? xs.at 0 xs.at 1)
    Max [xs.First, Max(xs.TrimLeft)],
Main -> Integer = Max [1, 5, 3, 4, 2],

---- 実装への夢想 ----

引数は束縛扱い?型は関数ポインタ。
IExpressionへの参照だけでなく、対応するIEnvironmentも同時に保持。

関数が呼び出された時は呼ばれる側で新たにIEnvironmentを作成。

履歴とかTODOとか(ヘルプファイルができるまでの暫定メモ)

2002-07-24 プロジェクト作成。
2002-07-25 画面作成。とりあえずPixiaでブラシで塗っただけのスキン。
2002-08-07 単項であれば計算?できるように。1と入力すれば解答欄に1と出てくる程度。
2002-08-08 中置記法のパーサを大雑把に仕上げる。足し算とかかけ算とかできるように。
2002-08-09 比較演算子を作成。関数をオーバーロード可能に。
2002-08-10 Monad?、条件分岐。
2002-08-12 2進数と16進数。Sin、Cos追加。
2002-08-13 束縛を実装する。なんか凄い苦労した感じ。
2002-08-14 三角関数とか色々追加。^ 演算子追加。ビット演算実装。前置記法実装。
2002-08-15 ユーザー名.iniを書くように。
2002-08-16 論理演算実装。スコープのバグを直す。*.iniの読み込み。
2002-08-17 後置記法のパーサを大雑把に仕上げる。
2002-08-21 壁紙~(無駄機能)
2002-08-22 Webページ表示。
2002-08-23 シンプルモード。-INIREADONLY。(-NOINIは廃止)
2002-08-28 メニューを透過。(TOOLBAR使用)
2002-09-12 配列を実装。リストボックスのダブルクリックで入力。
2002-09-18 複素数を実装。
2002-09-26 俺が馬鹿だった…複素数の剰余算、角度出さなくてもできる…。ってことで精度UP。
2002-09-26 dllによる関数追加。一旦区切るかな…。
2002-10-17 2進数、16進数の記法をAdaに揃える。
2002-11-22 メニューのバグFixついでにXP風にオーナードローしてみる。
2003-02-26 再コンパイル。コアはEOFileと同一なので、あっちの変更により*.exeサイズが少し減った。

TODO
・ミニ関数型言語の名前を決める
・ヘルプファイルを書く(誰か書いて欲しいな)
・集合
・高階関数
・ミニ関数型言語自身による関数の追加
・散々夢想しているが、ある程度実用になった時点で放置する可能性大

壁紙を変えてみた例

Sample 1

Sample 2