Edited at

Rubyで俺指向言語Qのプロトタイプ作った.

More than 5 years have passed since last update.


バグ報告を頂ければ24時間以内に直します!

カモン-> @gogo_tanaka


俺指向言語Q

fooo↑↑

http://q-language.org/ja/


動機

僕はただの数学/統計系の学部生で、RやMathematicaなどの言語を強いられる事が多いのですが、

RubyやHaskellやScalaなどのステキな言語を知っていると「ちょっとな〜」と思っておりましたところ、

突然「あ、新しい言語作らなアカン」という不可思議な衝動に駆られ

ガッと取り憑かれたように実装し、少し冷静になってQiitaを書いているのが今です.

フィードバックを頂きながら育てて行きたいと思います(コミッター絶賛募集中、ワイワイ楽しくやりたいです. アメちゃん差し上げるのでお願いします. )

現在はコンパイラと4秒くらいで作ったインタプリタがあります.


ポリシー

一番大きな観念としては


「紙とペンの感動をキーボードで」

です.

後々の可読性や保守性などはどうでもよくて、

「その瞬間(コードを書いている瞬間)の気持ちよさ、心地よさ、そしてその返値を楽しむ事」

を追求しました.

例えばRで行列を表現しようとすると

matrix(c(1, 2, 3, 4, 5, 6), 2, 3, byrow = TRUE)

こうなります.

まあ細かいシンタックスは各論も各論なんでいいっちゃいいんですが、僕は書きたくないです.

頭に浮かんだモノをその熱が冷めないうちにアウトプット出来る事が大事だと考えています.

またもう一つ、このQ言語は現在コンパイル先をRとRubyの2通り選べます.

行列やベクトルや数式を抽象化して出力に関しては粗結合に設計しているので

(抽象化されたモノを各言語に落とすAPIを書くだけで良い)

複数言語対応も割と簡単に行えると思えます.

Q言語を書けばどの言語、環境でも動く. ステキじゃないでしょうか.


なぜRuby


  1. コミュニティが大きく反応が得られやすいと思った


  2. 僕自身Rubyがいちばんいじれるのでアイディアをプロトタイプに落としやすかった


  3. Rubyが好きだった

    (Ruby上での数式/統計処理を盛り上げたいと思った)


いい感じになってきたらHaskellで全部実装し直したいなと思ってます.


Qという名称の由来

R言語の前進はS言語


仕様

特にちゃんと説明しませんが

紙面上で数学をする感覚そのものが仕様です

「Hello World!」など出力している時間は無駄です.

(以下はインタプリタに対する入力と出力を淡々と載せてます)


微分

d/dx(cos(x))

=> ( - sin( x ) )

d/dx(log(x))
=> ( 1 / x )

d/dy(y ** 2)
=> ( 2 * y )

d/dz(e ** z)
=> ( e ** z )


積分

S(log(x)dx)[0..1]

=> - oo

S( sin(x)dx )[0..pi]
=> 2.0

S( cos(x)dx )[0..pi]
=> 0.0


Matrix, Vector

(1 2 3; 4 5 6)

=> (1 2 3; 4 5 6)

(1 2 3; 4 5 6) + (1 2 3; 4 5 6)
=> (2 4 6; 8 10 12)

(1 2 3; 4 5 6) * (1 2 3)
=> (14 32)


関数


* 関数についてver 0.0.141以前にバグがありました. すみませんでした.

こんな感じ.

f(x, y) = x + y

f(2, 2)
=> 4

g(x) = x ** 2

g(2)
=> 4

ちなみに引数名は2文字以上を受け付けていません.

(;゜0゜)「2文字以上を受けつけてない!?」

また関数名はf, g, h のみしか受け付けておりません.

(;゜0゜)「!?」

(今後検討の余地あり)

この言語は別に大きなアプリケーションを複数人で作ることなどは全く想定していなくて、

「紙面上で数式処理する感覚に近いものをプログラミング上で表現する」に基づいて

可読性は自分のためのみで、その瞬間だけあればいい.

あえて無駄な自由を除く事で大きな自由を勝ち取ろうという信念があります

ちなみにコンパイラを使うと

(1 2 3; 4 5 6)

はこれはRと

matrix(c(1, 2, 3, 4, 5, 6), 2, 3, byrow = TRUE)

Rubyの

Matrix[[1, 2, 3],[4, 5, 6]]

に相当ます.


Vector

こんな感じ

(1 2 3)

これはRの

c(1, 2, 3)

これはRubyの

Vector[1, 2, 3]

に相当します


List

こんな感じ

{name: “Gogotanaka”, age: 21, birth: (1992 8 10) }

これはRの

list(name="Gogotanaka", age=21, birth=c(1992, 8, 10))

に相当します.


使い方

Rubyが動けば動きます.

gemの管理などはよしなにやって下さいませ.

gem install qlang

これで qlang コマンドが使える様になります.

qだと汎用性高すぎるので避けました.)


Rにコンパイル

qlang -c -R foo.q


Rubyにコンパイル

qlang -c -Ruby foo.q


対話モード

コンパイラの時点で力つき、Rubyの処理を間借りして4秒くらいで作りました.

qlang -i

この新言語Qは


PRやご鞭撻待ってます

僕はただの数学畑の人間でCSの深い知識もなければ

字句解析や構文解析はWikipediaで調べたくらいなので、

この辺りに深い見識をお持ちの方のPRやご鞭撻待ってます.

あと、Rubyでゴリゴリと作ってしまったのでリファクタやテストも相当に必要です.

ドキュメントの拡充も

ふう...

お後が宜しいようで.


追記(8/20)

http://qiita.com/gogotanaka/items/22f7a87ea6d65a0eff46

v0.0.14142135がリリースされました.

多くのバグフィックスと3つのfeatureを含んでいます.