Factorに入門する(1) とにかく使ってみる
Forthの流れをくむ言語はいろいろありますが、今いちばん熱そうなFactorをつまみぐいしてみています。
環境設定
インストールはとても簡単です。Macでは(おそらく他のプラットフォームでも)ダウンロードして適当な場所に置くだけ。
そのままでも、GUIなWorkspaceが使えますが、わたしはemacsで使います。emacsの設定は、factor/misc/fuel/READMEに従って実施。
基本概念
- word
- 関数・命令のこと。Forthと同じ。
- Vocaburary
- パッケージのようなもの。名前空間を分離した、wordのあつまり。
チュートリアル
オンラインのドキュメント(配布物にも同じ内容が同梱されてる)に、Your first programってのがあるので、まずはこれにしたがってやってみましょう。
vocaburary作成
この指示に従い、まずはオレ用vocaburaryを作成。Emacsなので、M-x fuel-scaffold-vocabを使ってみました。
で、超簡単なword (palindrome?)を定義したら、このtutorialでは"Press F2"ってかいてある所、C-c rでfuel listnerに戻ると、vocaburaryを読み直してくれます。
emacs上でhelpを引くのは、C-c h。
このチュートリアルは、回文を判定するwordを作るだけです。かなり短くて、あっという間におわります。印象的だったこと:
- vocaburaryのテンプレートを作成するためライブラリが標準で存在する
- テストのフレームワークも標準で含まれている。書き方も実行もとても簡単。
- ドキュメンテーションもどうやらFactorのコードで書くようです。
- ワード定義に書くカッコで囲まれた部分。Forthでは習慣として実行前・実行後のスタック状態を書く単なるコメントでしたが、Factorでは機能が割り当てられた構文(Stack effect declaration)だそうな。
stck effect declaration
Forthではただのコメントだったものがどう進化したかチェックしてみました。inferまたはinfer.というwordでチェックできるみたいです。
( scratchpad ) : legal-func ( x y z -- x ) * + ; ! 正しいstack effect declaration ( scratchpad ) 1 2 3 legal-func . 7 ( scratchpad ) [ legal-func ] infer. ! チェック ( object object object -- object ) ( scratchpad ) : illegal-func ( x -- x ) dup 1 + ; ! 正しくないdeclaration。ただしくは( x -- x y ) ( scratchpad ) 1 illegal-func . 2 --- Data stack: 1 ( scratchpad ) . 1 ( scratchpad ) [ illegal-func ] infer. In word: illegal-func Stack effects of the word illegal-func do not match. Inferred: (( object -- object object )) Declared: (( x -- x )) Type :help for debugging help. ( scratchpad ) : illegal-or-legal ( str -- str ) length ; ! 数はあってるけど正しくは ( str -- n ) ( scratchpad ) "foobar" illegal-or-legal . 6 ( scratchpad ) [ illegal-or-legal ] infer. ! 数しかチェックしてないのでOK。 ( object -- object ) ( scratchpad )
この後調べたいことメモ
リテラルのいろいろ・実行モデル詳細(データスタック以外のスタックとか、辞書とか)ソースをパースするタイプの命令のモデル(USE: とか \とか)・スレッドでのスタック扱い(継続ベースの軽量スレッドがあるみたい)・Combinatorとはなんぞや・等々