ファイル世界との国交回復(その1)
私がSmalltalk を好きだ好きだと言いつつ、積極的に使えてない理由は、Smalltalk というものがWindowsやMac、Unix と言った現状のOSに余り馴染まないからというのが理由だと思います。
Squeak を使っていると、全てのコンピュータ上の生活をSqueak上でおくれたらどんなに幸せかと思うけど、現実はそうはいかない。だって私の仕事は Windows マシンだからだ、というのが大きな理由です。(Squeak中にアプリケーションみたいなノの完成度の低さも大きな原因だけど。)
なのでスクリプト風のSmalltalk を探したり、試したりするのだけれどなかなか良いのが見つからないです。うーん、趣味なSmalltalkerな皆さんはどのような局面で Smalltalk を使っているのでしょうか。
と、ちょっとあちこち見てみたら、意外にSqueakで頑張っているみたい。そうやって頑張った末に鍛え上げたMy image は最強になるらしい。かっこいいなぁ。
と言うわけで、私も頑張ってみることにしました。ファイルのないOSの世界から、全てがファイルの世界への帰還ですから、まずはファイルとディレクトリの扱い方から。
ディレクトリの開き方
ディレクトリの扱いは、FileDirectory クラスを使います。
FileDirectory default "==> DosFileDirectory on 'C:\Squeak38'"
あ、コメントの中の==>以降は、print it した結果です。Squeak.exeのあるディレクトリですね。任意のパスのディレクトリを開くには、 #on: メッセージを送ります。
FileDirectory on: 'C:\tmp\hoge'
ディレクトリ操作
実行例として以下のようなディレクトリ構造を作りました
C: └Squeak38 ←ここがdefaultディレクトリ ├foo │ └bar └hoge └piyo
FileDirectory オブジェクトには、便利なメソッドが用意されています。例えば #fileNamed: メソッドは、直下のディレクトリ名を取得します。
FileDirectory default directoryNames "==> #('foo' 'hoge')"
また、#containingDirectory は、逆に自身を含むディレクトリ(親ディレクトリ)を取得します。
FileDirectory default containingDirectory "==> DosFileDirectory on 'C:' "
普通によく使いそうなのがコレ。あるディレクトリ配下の全てにある操作をします。
FileDirectory default withAllSubdirectoriesCollect: [ :dir | Transcript cr; show: dir ]
結果:
DosFileDirectory on 'C:\Squeak38' DosFileDirectory on 'C:\Squeak38\foo' DosFileDirectory on 'C:\Squeak38\hoge' DosFileDirectory on 'C:\Squeak38\foo\bar' DosFileDirectory on 'C:\Squeak38\hoge\piyo'
ブロックの中でやっていることがTranscriptに書き出すだけかいっ!と、とてもつまらないサンプルで恐縮ですが、サブのさらにサブや自分のディレクトリに対しても実行されていることにご注目。わざわざプログラマが再帰的に書かなくても良いので、これはとても便利です。