2008/01/12

今年の言語 : Factor

FAQ によると Factor は 関数型で、動的型付けで、オブジェクト指向で、スタックベースのプログラミング言語であり、Forth と Lisp を組合せたような言語だそうです。
設計者は Slava Pestov さん。
UI 系や Web 系のライブラリも充実しているようです。

公式サイト : Factor programming language
http://factorcode.org/

planet-factor
http://planet.factorcode.org/

まずはセットアップから

ダウンロードは http://factorcode.org/download.fhtml から。
Windows と Mac OS X は バイナリがあります。
Linux はソースからビルドする必要があります。

ソース Factor-0.91.tar.gz と ブートイメージ boot.x86.64.image をダウンロードします。
tar zxvf Factor-0.91.tar.gz
cd factor
make linux-x86-64
cp ../boot.x86.64.image .
./factor -i=boot.x86.64.image

しばらく待つと factor.image ができあがります。
このあたり Lisp っぽいですね。

いじってみる

./factor でいきなり GUI が起動します。
Windows でも factor-nt.exe をダブルクリックすると同じ GUI が起動します。
ただし、パス名に日本語含まれていると起動できないので注意してください。

Output のパネルに 「Factor cookbook」 から始めるようにとあるのでそれをクリックします。

「.s」 でスタックの中身を表示する。
「.」 でスタックの一番上のオブジェクトを表示する。
vacabularies のロードには 「require」 を使う。
「Vocabulary index」を見てみること(一覧が表示された。たくさんある)。
「"tetris" run」でテトリスが動く(うん、動いた)。
ソースファイルのロードには「run-file」を使う。
この UI の使い方は「UI development tools」を見る。
あとはクックブックのリストです。

次は Input のパネルに入力してみましょう。
! 以降はコメントです。入力しないでくださいね。
1 2 3 ! これで 1 2 3 がスタックにつまれます。
.s ! スタックの内容 1 2 3 が表示されます。でもスタックから取り除かれはしません。
. ! スタックの一番上にある 3 が表示されます。3 はスタックからなくなります。
.s ! スタックの内容 1 2 が表示されます。
1 2 + . ! 足し算。1 と 2 がスタックにつまれ + がスタックから 1 と 2 を取り出して 3 をスタックに詰む。. で 3 をスタックから取り出す。

数値や文字列などのリテラルは入力するとスタックにつまれます。
Read Eval Print に慣れ親しんだ身としては不思議な感じです。
word と言われるのは、他の言語で言うところの関数に相当するものです。
となると vocabulary はモジュールですね。

なじみのある quatation というのもあります。
quatation は [ と ] で囲みます。
Lisp と同じで評価されることはありません。評価されずにスタックにつまれます。
call でスタックから取り出されて評価されます。
[ 1 2 + . ]
call ! 3 が表示される。

quatation があれば if が可能となる。
ということで if は次のようになります。
1 2 = [ "then!" ] [ "else!" ] if . ! "else!" が返る。

word の定義は : で始まり ; で終ります。
Hello World を作ってみますかね。
: hello-world "Hello World!" print ;
hello-world ! "Hello World!" と表示される。

fib を定義してみると次のようになります。もっとエレガントな方法があるかもしれませんが。

: fib
dup 3 <
[ drop 1 ]
[ dup 1 - fib swap 2 - fib + ]
if ;

10 fib . ! 55 が返る。


あと UI の Input では TAB で word の補完が可能です。
Inspector もありソースコードにもすぐアクセスできるようになってます。
Lisp と同じ apropos word もありますね。

Emacs からの利用は ~/.emacs に次を追加します。
;;;;Factor
(add-path "~/letter/factor/factor/misc")
(setq factor-binary (expand-file-name "~/letter/factor/factor/factor")
factor-image (expand-file-name "~/letter/factor/factor/factor.image"))
(autoload 'factor-mode "factor" "Factor mode" t)
(autoload 'run-factor "factor" "Start a Factor listener inside Emacs" t)
(add-to-list 'auto-mode-alist '("\\.factor\\'" . factor-mode))


ということで、なかなか面白い言語だと思います。
触っていて楽しいです。
基本がシンプルなところが好きです。
そして、去年の言語 Erlang にプロセスという新しい思考概念があったように、Factor にはスタックという新しい思考概念があります(新しいというのは私のとってのことですが)。
去年の言語は Erlang でしたが、今年の言語は Factor にしましょう。

0 件のコメント: