Grassという言語があるので、とりあえずHello Worldと出力するコードを書いてみました。
とりあえず、上記サイトで紹介されているインタプリタをダウンロードします。 というコードを実行すると、
Ruby版は自分の環境(ruby 1.9.3p194 (2012-04-20) [i386-mingw32])ではエラーが出てしまいましたが、
Python版とJava版はきちんと実行できました。
次に、インタプリタを使いやすくします。
Python版はデフォルトでは標準入力からしかソースコードを入力できないので、
適当なラッパを書いてファイルから読み込めるようにしました。
# -*- coding: utf-8 -*-
if __name__ == "__main__":
import grass
import sys
grass.run(open(sys.argv[1]).read())
(code=Pythonだと一部の文字が黒くなり、見えにくくなったのでText使用)
Java版はそのままコンパイルすると大量のファイルができるので、jarにまとめて実行しやすくします。
以下、YUKI.N>はプロンプトを示します。
- 適当なディレクトリにGrass.javaを置き、そこで というコマンドを実行してコンパイルします。
- とりあえずjarファイルを作成します。1と同じディレクトリで というコマンドを実行します。
- 2で作ったjarファイル(7-zipなどでzipファイルとして開けます)からMETA-INFディレクトリを抽出し、1と同じディレクトリに置きます。
- 3で抽出したMETA-INFディレクトリの中にあるMANIFEST.MFをテキストエディタで開き、
最後の行に と書き加え、保存します。このとき、空行を入れてはいけません。 - 1のディレクトリの中身全部(META-INFディレクトリとその中身を含む)をzipファイルに圧縮します。
このとき、jarコマンドを使うと、せっかく作ったMETA-INFディレクトリがなぜか無視されてしまいました。
zipファイルの直下に1のディレクトリの中身がある(zipファイルの中に余計なディレクトリが無い)ようにしましょう。
そして、作成したzipファイルをgrass.jarにリネームします。 - 完成です。grass.jarを保存したディレクトリで というコマンドを実行し、 と表示されれば(多分)成功です。エラーが出てしまった場合は頑張って修正してください。
言語仕様上いきなりHello Worldは少し難しいので、まずは"www"(引用符は除く)と出力してみました。
言語仕様を簡単にまとめると
- 「関数定義」と「関数適用」ができる
- スタックがあり、初期値は
(上の行ほど出入口に近い)
である。
スタックと言っても、最後(出入口)から数えて任意の位置のデータが取り出せるし、データの削除は無いので、
むしろC++のstd::vectorやPythonのリストなどに近いと考えられる。 - 「関数適用」では、実行する関数とその引数1個を指定する。その返り値がスタックに追加される。
2引数以上の関数では、おそらくHaskellと同様にf(x,y)に引数aを入れると関数g(y)=f(a,y)が返ってくると思われる。
テストコード - 「関数定義」では、引数の数と「関数適用」の列を指定する。その関数がスタックに積まれる。
定義された関数は、常に定義した時点でのスタックに引数を積んだスタックとともに実行が開始される。
実行終了時点でのスタックの最初(出入口)に積まれているデータが返り値となる。 - プログラムは、「関数定義」や「関数適用」が書かれている順番で実行される。
- 最初の'w'の前の文字列は無視される。すなわち、最初は「関数定義」をしないといけない。
- 最後まで実行した後、スタックの最初(出入口)のデータを関数として、その関数自身を引数として実行が行われる。
そして、"Hello World\n"を出力するコード。
wWWWwWWWWwvwWWwWWWwvwWWwWWWwvwWWwWWWwvwWWwWWWwvwWWwWWWwvwWWwWWWwv
wWWWWWWWWWWwWWWWWWWWWwv
WWwwwwwwwwwwwWWWWWWwWWWw
WWWWWWWWwWWWWWwWWWWWWw
WWWWWWWWWWwWWWWWWWWWWWWWw
WWWWWWWWWWWwwwwwwwwWWWWWWWWWWWWWw
WWWWWWWWWWWWWWwwwwWWWWWWWWWWWWWWWWWWw
WWWWWWWWWWWWWWWWWWWWWWw
WWWWWWWWWWWWWWWWWWWww
WWWWWWWWWWWWWWWw
WWWWWWWWWWWWWWWWw
vwWWWWWWWWWWWWWWWWWWWWWWWWWWwv
WwwwwwwwwwwWWwwwwwwWWWwwwwwwWWWWwWWWWWwwwwwww
WWWWWWwwwwwwwwwwwwwwwwwvwWWWWWWWWwwwwwwwwwwwwwwwwwwwwwwv
WWWWWWWWwwwwwwwwwwwwwwwWWWWWWWWWwwwwvwWWWWWWWWWWWwv
WwwwwwwwwwwwwWWwwwwwwwwWWWwwwwwwwwwwwwwwwwww
vwWWWWWWWWw
次に、それらの関数を使って必要な文字データを作っていきます。
その後、ソースコードの長さを減らすためにOut関数を再定義しながら、"Hello World"を出力します。
最後に、"\n"を出力する関数をスタックに置き、終了動作で出力させます。
実行終了時のスタックは、以下のようになっているはずです。
► スポイラーを表示
wWWWwWWWWwvwWWwWWWwvwWWwWWWwvwWWwWWWwvwWWwWWWwvwWWwWWWwvwWWwWWWwvwWWWWWWWWWWwWW
WWWWWWWwvWWwwwwwwwwwwwWWWWWWwWWWwWWWWWWWWwWWWWWwWWWWWWwWWWWWWWWWWwWWWWWWWWWWWWW
wWWWWWWWWWWWwwwwwwwwWWWWWWWWWWWWWwWWWWWWWWWWWWWWwwwwWWWWWWWWWWWWWWWWWWwWWWWWWWW
WWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWwwWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWwvwWWWWWWWW
WWWWWWWWWWWWWWWWWWwvWwwwwwwwwwwWWwwwwwwWWWwwwwwwWWWWwWWWWWwwwwwwwWWWWWWwwwwwwww
wwwwwwwwwvwWWWWWWWWwwwwwwwwwwwwwwwwwwwwwwvWWWWWWWWwwwwwwwwwwwwwwwWWWWWWWWWwwwwv
wWWWWWWWWWWWwvWwwwwwwwwwwwwWWwwwwwwwwWWWwwwwwwwwwwwwwwwwwwvwWWWWWWWWw
やっぱりPythonは遅いですね。え?RPython?いえ、知らない子ですね。