Factorへの入門第12回。ここまできたら、自分のためにも適切に配列したちゃんとした入門を書こうかと目論んでいます。

さて、Factorは言語としても強力ですが、"a practical stack language"と名乗っているとおり、実用的な面も抜かりありません。

ライブラリだけじゃなくて、テストやドキュメンテーション作成のサポートもしっかりしてます。現時点では標準のGUI環境より、添付されている強力はemacs factor mode "fuel"を使ったほうが便利なような気がしますが、factorはかなりのハイペースでバージョンアップしているので日々状況は変化しています。

今回は、vocaburary作成とテストをemacsからやってみます。ネタは先日やった17歳教にします。

emacsをたちあげ、

M-x fuel-scaffold-vocab

こう入力すると、

Vocab name:

ときいてきます。vocaburary名はage17としますので、age17と入力します。すると、

Vocab root: resource:

と、vocaburary rootをきいてきます。どこに配置するのかきいてくるのですね。ここでresource:につづけてworkと入力すると、age17.factorが作成され、ファイルが開きます。

! Copyright (C) 2009 KOJIMA Satoshi.
! See http://factorcode.org/license.txt for BSD license.
USING: ;
IN: age17

ここで1行目に注目。すでに私の名前がはいっています。通常、developer-nameというfactorのグローバル変数が使われますが、
emacs上のfuel-scaffold-vocabを使った場合はちょっと違います。fuel-scaffold-developer-nameというemacs上の変数が使われます。この値にはデフォルトでemacsのuser-full-name変数がセットされます。このため、私の環境では特に新たな設定をしなくても、名前がセットされたのですね。

コードをちょいと書いてみます。途中をとばして、まずはdurationから月数をintegerで取り出すwordを書きます。

! Copyright (C) 2009 KOJIMA Satoshi.
! See http://factorcode.org/license.txt for BSD license.
USING: kernel math.parser calendar math io ;
IN: age17
: duration>monthsInInteger ( duration -- x ) duration>months >integer ;

ここで、C-c rとすれば、このvocaburaryをlistenerで読み取ってくれます。

そしたら、こいつのテストを書いてみましょう。fuelでは、C-coで、code/documents/testが切り替わります。

Create /Applications/factor/work/age17/age17-docs.factor? (y or n)

ここではdocument作成はとばします(documentもscaffoldでひな形つくれるので、それは次回)ので、n。

Create /Applications/factor/work/age17/age17-tests.factor? (y or n)

ここではyとして、testのファイルを作成します。中身にこんなふうに書いてみましょう。

USING: math kernel age17 calendar tools.test ;
[ 10 ] [ 0 10 0 0 0 0 <duration> duration>monthsInInteger ] unit-test
[ 130 ] [ 10 10 0 0 0 0 <duration> duration>monthsInInteger ] unit-test
[ 130 ] [ 10 10 1 2 3 4 <duration> duration>monthsInInteger ] unit-test
[ 0 ] [ 0 0 1 2 3 4 <duration> duration>monthsInInteger ] unit-test

ワードunit-testは、期待されるstackのシークエンスと、テストしたいコードのquotationを与えると、テストして結果を返します。listener上かの実行は、"vocaburary名" test、とシンプルです。

( scratchpad ) "age17" test
Loading resource:work/age17/age17-tests.factor
{ [ 10 ] [ 0 10 0 0 0 0 <duration> duration>monthsInInteger ] }
{
[ 130 ]
[ 10 10 0 0 0 0 <duration> duration>monthsInInteger ]
}
{
[ 130 ]
[ 10 10 1 2 3 4 <duration> duration>monthsInInteger ]
}
{ [ 0 ] [ 0 0 1 2 3 4 <duration> duration>monthsInInteger ] }
==== ALL TESTS PASSED

今回はtestを後にかきましたが、このくらい手軽なので、test駆動でやるのも気楽です。次回は、helpのscaffoldについてとりあげます。