計算言語 neu
2011.08.09
先日も述べた様に iPad 用の計算アプリを作っているのだが、「電卓のように手軽に使えるけど、Excelで普通の人がすることの80%は出来てしまう」という目標をを達成するために、色々な工夫をしている。その一つが、計算言語の定義だ。特に名前は付けていないが、仮の名前として neu と呼ぼう。
ご存知のように、電卓に
1 + 2 =
と打てば、3という答えが出て来る。
1.5 sin =
と打てば、sin(1.5)を計算してくれる。厳密な意味での「プログラミング言語」とは呼べないかも知れないが、「あるシンタックスに従ってキー入力すれば、何らかの計算をしてくれる」という点では、広い意味での「言語」とも読んでもバチは当たらないだろう。
では、さっそく計算言語 neu の定義をしてみる。
- "+"の様に右と左に置かれた二つの数値にから一つの数値を導き出すものをオペレータと呼ぶ。"-"、"x"、"÷"、"y^x"、"x√y" などもオペレータである。
- "sin"の様に左に置かれた数値から別の数値を導きだすものをファンクションと呼ぶことにする。"cos"、"tan"、"1/x"、"log"、"!" などもファンクションである。
- ファンクションは常にオペレータよりも先に実行される(2 + 1.5 sin は、先にsin(1.5) を計算してから、それを2に加える)。
- 複数のファンクションが連続する場合は、常に左から右に順番に実行される。オペレータも基本的には左から右に順番に実行されるが、"+"と"-"だけは例外的に他のオペレータよりも後から実行される。
- ファンクションやオペレータの実行順をコントロールしたい場合は括弧を使う。
これだけだと今までの電卓と変わらず、表計算のようなことはできない。表計算に近いことをするために、「リスト」というコンセプトを導入する。
- リストは、数値の1次元配列(数列)である。
- リストは、数値もしくはリストを "," オペレータで接続することにより定義する
すなわち、
1, 2 =
とすれば、リスト [1, 2]が返される。
1, 2, (3, 4 + 5) =
とすれば、リスト [1, 2, 3, 9]が返される。
多くのオペレーターや関数は、リストをそのまま扱うことができる。
(1, 2, 3) + 5 =
とすれば、リスト [6, 7, 8] が返される。
(1, 2, 3) + (10, 20, 30) =
とすれば、リスト [11, 22, 33] が返される。
さらに、リスト専用のオペレータや関数も導入が可能になる。例えば、
(10, 20, 30) avr =
とすると、三つの値の平均(20)が返される。
(10, 20, 30) stdev =
とすると、三つの値の標準偏差(8.16)が返される。
(30, 20, 10) sort =
とすると、順番に並び替えて、リスト[10, 20, 30]を返す。
数値からリストを作る関数もある。たとえば、
10 [...x-1] =
とすると、リスト[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]が作られる。
これを応用して、
(10 [...x-1]) x (10 [...x-1] + 1) =
とすることにより、n*(n+1) の数列(ただし、n は 0から9まで)などが簡単に生成できる。
◇ ◇ ◇
なぜこんなことをアプリのリリース前に書いたかというと、「これぐらいの説明をざっと読んだだけでどのくらいの人たちに、この言語のポテンシャルを理解してもらるか」を知りたいからである。上の説明を読んだだけで、「これはすごい、ぜひとも使いたい」と言っていただけるのであれば良いが、「これを読んだだけでは、どこが良いのかさっぱり分からない」という意見が多いのであれば少し考え直さなければならない。
ベクトル演算ぽいですね。R言語にちょっと似てる気がします。
Posted by: こじま | 2011.08.09 at 23:20
ファンクションのパラメータを後置表記にもできたり、
最大値 [...x-1] を [最小値...最大値...差分]のような表記ができると、Cのプログラムに慣れた私には見やすいです。
三角関数やlogがあるということは定数π,eやラジアン表記なども期待します。
Posted by: Bis | 2011.08.10 at 00:21
10 [...x-1] = が[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]に違和感を感じました.個数[0を初期値とする数列 x 差分] かなと思ったからです.表計算だとリストのリストが必要になると思うんですが,それはどのように扱うのでしょうか.
Posted by: 台場 | 2011.08.10 at 00:34
ポケコン(・∀・)イイネ!!
Posted by: tontoron | 2011.08.10 at 05:32
>1, 2, (3, 4 + 5) =
この結果は[1,2,[3,9]]となる感じがするのですがどうでしょう?(括弧が誤記なのかな?)
リストによってお手軽に関数電卓的計算が出来るのは便利そうです。
Posted by: mihael | 2011.08.10 at 06:42
関数型言語のmap/fold(reduce)のような書き方はできませんか?
私の察しが悪いだけかもしれませんが、これだけではむしろ表現能力が低いように感じます。
Posted by: k | 2011.08.10 at 06:55
これはiOSだけに留めるのは勿体無いですよ。
演算エンジン部分だけでも公開するか移植して、
WindowsのCUIでも使えるようにして欲しいです。
Posted by: これ欲しい | 2011.08.10 at 07:26
プログラミングなどの専門的な仕事をされる方が手軽に使えて便利そうなツールという風に理解しました。
Posted by: 鈴木 晋太郎 | 2011.08.10 at 09:24
作成したリストは保存できるのでしょうか?保存までできてしまうと、リスト用に変数が欲しいとか、外部から(たとえばDropboxから)csvを読み込みたいとか思ってしまいますね。
Posted by: Tomo | 2011.08.10 at 12:08
excelは時間や日付の計算ができますね。
Posted by: ryu | 2011.08.10 at 16:00
[ [クラス全員の算数の点数リスト] , [クラス全員の国語の点数リスト] ]avr =[国語と算数の平均値リスト]
もできるのかな。
1:nの演算だと分かりやすいけど、n:nのリスト演算だと入力ミスした時に発狂してしまうかもしれない。ラベル的なものがあればかなり使いやすそう。やっぱり決め手となるのは最後の味付けGUIなんでしょうね。
「コンピュータ音痴でも使えるExcel」
「コンピュータ音痴でも使えるLisp」
のどちらを目指すかで、可能性とハードルがかなり変わってきそう。
Posted by: magnara | 2011.08.10 at 16:26
Excelというか、Mathematicaに近い感じですね。
再帰計算までできるとかなり便利だと思いますが、ここまでするならExcelの方が手軽だということになってしまう気もします。
Posted by: まいすた | 2011.08.10 at 17:56
ちょっとした言語設計というのは楽しそうですね!
気になった点ですが、
プログラミング言語知っている理系からすると
リストとか集合演算の概念はよく分かりますが、
一般的な人からすると、分かりやすいのでしょうか?
あまり馴染みがないのかなと思います。
Posted by: tavi | 2011.08.10 at 18:15
「iPad向けの計算アプリを開発中」で期待し、
「計算言語 neu」で落胆しました。
個人的な感覚で、一般的にExcelですることとかけ離れていることをしているのではないでしょうか?
電卓ではなくExcel(表計算)を使う理由は、
@計算したい数値(入力した数値)を変更しやすいこと。
@入力した数値の履歴が残ること(後で修正しやすいこと)
@入力する数値に名前付けできること(名前で計算式が入力できること)
を想像します。
記事の「リスト」機能は、Excelの配列に対応するものと思いました。1つのセルに"={1,2,3}"のように入力するものです。Excel機能の残り20%に入る機能です。普通の人は、複数のセルにそれぞれ数値を入力してセルの集まりでリストを作成します。
その方が可読、修正が簡単だからです。
演算エンジンとしてはポテンシャルが高いかもしれませんが、
リストの自動作成などはUIをイメージできるかが鍵になると思います。
逆ポーランド記法を思い出し、HPの関数電卓が浮かびました。
Posted by: Wematsu | 2011.08.10 at 18:17
(1,2,3)x(4,5,6)=[4,10,18]
(1,2,3)x(4,5)=ERROR?
(1,2,3)x([4],[5],[6])=[[4,8,12],[5,10,15],[6,12,18]]
"Latex" Sum^{9}_{n=0} n*(n+1)
n:=10[...x-1]
ans=n*(n+1)sum=(10[...x-1])x(10[...x-1]+1)sum
"Latex" Sum^{9}_{n=3} n*(n+1)
n:=7[...x+2]
ans=n*(n+1)sum=(7[...x+2])x(7[...x+2]+1)sum
こんな計算式になる?
Posted by: Wematsu | 2011.08.10 at 20:54
ところで、 iOS SDK Agreement 3.2.2項で、インタープリタを実装してはいけない、ようなことが書かれていたと思うのですが、これって回避できているのでしょうか?
それとも、保存されたスクリプトは実行できず、あくまで逐次入力のみの対応なのでしょうか?
Posted by: aaa | 2011.08.11 at 01:50
Excelの便利さについて考えてしまっていました。
・数式と数値が分離されていて数値だけ簡単に書き換えられる
・数値が日付も扱える
とかかなぁと。
式を入れると下に変数部分の入力ボックスが出現して数値だけ入れられるとかでも
面白いかと思います。
Posted by: ryu | 2011.08.11 at 03:54
リスト表記を導入するなら、もっと「オブジェクト」的な GUI を導入しないと
アプリにする意味は薄いかなーと思いました。
1行に計算式を押し込むのではなくて、リストオブジェクトみたいな塊を
いくつも画面に浮かべておいて、オペレータを選んで接続していくといった感じでしょうか。
Posted by: ryo | 2011.08.11 at 22:56
「Excelで普通の人がすること」で関数電卓ができないことって、ベクトルや行列の扱いでしょうか。
それだとperlとかのLLがiPad上で使えるようになるという路線のほうが使い勝手よさそうに思いますが、Appleが許してくれないのでしょうね。
Posted by: miuk | 2011.08.13 at 09:20
「Excelで普通の人がすること」で関数電卓ができないことって、ベクトルや行列の扱いでしょうか。
それだとperlとかのLLがiPad上で使えるようになるという路線のほうが使い勝手よさそうに思いますが、Appleが許してくれないのでしょうね。
Posted by: miuk | 2011.08.13 at 09:20
これ、普通のビジネスパーソンがつかえるかな?
エクセルって数式を意識しなくても大量の演算ができることも
大きいかと。
Posted by: neko | 2011.08.14 at 21:13
これ、普通のビジネスパーソンがつかえるかな?
エクセルって数式を意識しなくても大量の演算ができることも
大きいかと。
Posted by: neko | 2011.08.14 at 21:13
あああ。
APLの影が…。(悪い意味じゃないですけど)
Posted by: yutangc | 2011.08.15 at 21:09