まもなく「米国で最も時価総額の高い会社」になろうとしているアッップル
パーソナルメディアとキュレーションと

計算言語 neu

先日も述べた様に 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まで)などが簡単に生成できる。

◇ ◇ ◇ 

なぜこんなことをアプリのリリース前に書いたかというと、「これぐらいの説明をざっと読んだだけでどのくらいの人たちに、この言語のポテンシャルを理解してもらるか」を知りたいからである。上の説明を読んだだけで、「これはすごい、ぜひとも使いたい」と言っていただけるのであれば良いが、「これを読んだだけでは、どこが良いのかさっぱり分からない」という意見が多いのであれば少し考え直さなければならない。

Comments

こじま

ベクトル演算ぽいですね。R言語にちょっと似てる気がします。

Bis

ファンクションのパラメータを後置表記にもできたり、
最大値 [...x-1] を [最小値...最大値...差分]のような表記ができると、Cのプログラムに慣れた私には見やすいです。

三角関数やlogがあるということは定数π,eやラジアン表記なども期待します。

台場

10 [...x-1] = が[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]に違和感を感じました.個数[0を初期値とする数列 x 差分] かなと思ったからです.表計算だとリストのリストが必要になると思うんですが,それはどのように扱うのでしょうか.

tontoron

ポケコン(・∀・)イイネ!!

mihael

>1, 2, (3, 4 + 5) =

この結果は[1,2,[3,9]]となる感じがするのですがどうでしょう?(括弧が誤記なのかな?)

リストによってお手軽に関数電卓的計算が出来るのは便利そうです。

k

関数型言語のmap/fold(reduce)のような書き方はできませんか?
私の察しが悪いだけかもしれませんが、これだけではむしろ表現能力が低いように感じます。

これ欲しい

これはiOSだけに留めるのは勿体無いですよ。
演算エンジン部分だけでも公開するか移植して、
WindowsのCUIでも使えるようにして欲しいです。

鈴木 晋太郎

プログラミングなどの専門的な仕事をされる方が手軽に使えて便利そうなツールという風に理解しました。

Tomo

作成したリストは保存できるのでしょうか?保存までできてしまうと、リスト用に変数が欲しいとか、外部から(たとえばDropboxから)csvを読み込みたいとか思ってしまいますね。

ryu

excelは時間や日付の計算ができますね。

magnara

[ [クラス全員の算数の点数リスト] , [クラス全員の国語の点数リスト] ]avr =[国語と算数の平均値リスト]

もできるのかな。
1:nの演算だと分かりやすいけど、n:nのリスト演算だと入力ミスした時に発狂してしまうかもしれない。ラベル的なものがあればかなり使いやすそう。やっぱり決め手となるのは最後の味付けGUIなんでしょうね。

「コンピュータ音痴でも使えるExcel」
「コンピュータ音痴でも使えるLisp」
のどちらを目指すかで、可能性とハードルがかなり変わってきそう。

まいすた

Excelというか、Mathematicaに近い感じですね。

再帰計算までできるとかなり便利だと思いますが、ここまでするならExcelの方が手軽だということになってしまう気もします。

tavi


ちょっとした言語設計というのは楽しそうですね!

気になった点ですが、
プログラミング言語知っている理系からすると
リストとか集合演算の概念はよく分かりますが、
一般的な人からすると、分かりやすいのでしょうか?
あまり馴染みがないのかなと思います。

Wematsu

「iPad向けの計算アプリを開発中」で期待し、
「計算言語 neu」で落胆しました。

個人的な感覚で、一般的にExcelですることとかけ離れていることをしているのではないでしょうか?
電卓ではなくExcel(表計算)を使う理由は、
@計算したい数値(入力した数値)を変更しやすいこと。
@入力した数値の履歴が残ること(後で修正しやすいこと)
@入力する数値に名前付けできること(名前で計算式が入力できること)
を想像します。

記事の「リスト」機能は、Excelの配列に対応するものと思いました。1つのセルに"={1,2,3}"のように入力するものです。Excel機能の残り20%に入る機能です。普通の人は、複数のセルにそれぞれ数値を入力してセルの集まりでリストを作成します。
その方が可読、修正が簡単だからです。

演算エンジンとしてはポテンシャルが高いかもしれませんが、
リストの自動作成などはUIをイメージできるかが鍵になると思います。
逆ポーランド記法を思い出し、HPの関数電卓が浮かびました。

Wematsu

(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
こんな計算式になる?

aaa

ところで、 iOS SDK Agreement 3.2.2項で、インタープリタを実装してはいけない、ようなことが書かれていたと思うのですが、これって回避できているのでしょうか?
それとも、保存されたスクリプトは実行できず、あくまで逐次入力のみの対応なのでしょうか?

ryu

Excelの便利さについて考えてしまっていました。
・数式と数値が分離されていて数値だけ簡単に書き換えられる
・数値が日付も扱える
とかかなぁと。

式を入れると下に変数部分の入力ボックスが出現して数値だけ入れられるとかでも
面白いかと思います。

ryo

リスト表記を導入するなら、もっと「オブジェクト」的な GUI を導入しないと
アプリにする意味は薄いかなーと思いました。

1行に計算式を押し込むのではなくて、リストオブジェクトみたいな塊を
いくつも画面に浮かべておいて、オペレータを選んで接続していくといった感じでしょうか。

miuk

「Excelで普通の人がすること」で関数電卓ができないことって、ベクトルや行列の扱いでしょうか。
それだとperlとかのLLがiPad上で使えるようになるという路線のほうが使い勝手よさそうに思いますが、Appleが許してくれないのでしょうね。

miuk

「Excelで普通の人がすること」で関数電卓ができないことって、ベクトルや行列の扱いでしょうか。
それだとperlとかのLLがiPad上で使えるようになるという路線のほうが使い勝手よさそうに思いますが、Appleが許してくれないのでしょうね。

neko

これ、普通のビジネスパーソンがつかえるかな?
エクセルって数式を意識しなくても大量の演算ができることも
大きいかと。

neko

これ、普通のビジネスパーソンがつかえるかな?
エクセルって数式を意識しなくても大量の演算ができることも
大きいかと。

yutangc

あああ。
APLの影が…。(悪い意味じゃないですけど)

Verify your Comment

Previewing your Comment

This is only a preview. Your comment has not yet been posted.

Working...
Your comment could not be posted. Error type:
Your comment has been posted. Post another comment

The letters and numbers you entered did not match the image. Please try again.

As a final step before posting your comment, enter the letters and numbers you see in the image below. This prevents automated programs from posting comments.

Having trouble reading this image? View an alternate.

Working...

Post a comment

Your Information

(Name is required. Email address will not be displayed with the comment.)