読者です 読者をやめる 読者になる 読者になる

レガシーコード生産ガイド

私に教えられることなら

factorでカレントディレクトリのファイルを出力するまで

factorcode

ずっと気になってたfactorにようやく手を出してみることにする。

これSmalltalkっぽい開発環境とか同図像性?とかライブラリの大きさとかすごいと思うんだけど、知ってる人すら少ない気がする。 しかし広めたいというよりむしろ、自分だけ極めて差を付けてやるゼ!と思っている。もしかしてみんな知ってて黙ってるだけか……?

とりあえずカレントディレクトリのファイル内容でも出力してみよう。何かそれっぽいのは無いかな、とcurrent-direまで入力してTAB押すとcurrent-directoryというそのもののワードが出てくる。とりあえず実行するとスタックにcurrent-directoryが積まれた。変数みたいだ。積まれた方のcurrent-directoryを右クリックし、Browseを選択するとその変数の説明と値が出てくる。うーんインタラクティブだ、素敵。

getで変数の内容を取得、ファイル名を積んでappend。文字列操作も簡単っぽいな。

current-directory get "/README.md" append

これで"/home/phaendal/factor/README.md"という文字列がスタックに残った。

その後試行錯誤して、次のコードでパス文字列からファイル内容を表示できた。

: cat-file ( path -- ) utf8 [ [ print ] each-line ] with-file-reader ;
current-directory get "/README.md" append cat-file

with-file-readerは ( path encoding quot -- ) という定義(SLIMEみたいに下に出てくるのがいいカンジ)なので、encodingにutf8、 each-line して print というquotationを置いておけばok。わかりやすい。

"/hoge/fuga" utf8 [ lines ] with-file-reader [ print ] each

でも同じ動作になった。with-file-readerの時点でスタックに積まれたものを右クリック→Inspectorで見ると、文字列の配列みたいだ。

ちなみに"./README.md"を積んでそのままcat-fileしても表示できた。

感想

Smalltalkの全てがオブジェクト/メッセージなところとか、LispのREPLで少しずつ作っていくのが好きなんだけど、factorの場合それらに加えて「全てが関数(ワード)実行」「スタックに積んだデータを直に触れる」という感覚のおかげでものすごくわかりやすくて一気に引きこまれた。あと見た目とか操作感覚もイカス。なんかエラー起きたりしても嫌な気分しないのがいい。

Lispもガンガン触って行きたいんだけどfactorも好きだな……時間が足りない。

広告を非表示にする