ファイル世界との国交回復(その1)

私がSmalltalk を好きだ好きだと言いつつ、積極的に使えてない理由は、Smalltalk というものがWindowsMacUnix と言った現状の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'

このように、FilreDirectoryクラスは特定ディレクトリへのディレクトリオブジェクトを作成します。

ディレクトリ操作

実行例として以下のようなディレクトリ構造を作りました

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に書き出すだけかいっ!と、とてもつまらないサンプルで恐縮ですが、サブのさらにサブや自分のディレクトリに対しても実行されていることにご注目。わざわざプログラマ再帰的に書かなくても良いので、これはとても便利です。

ファイルを開く

ファイルを開くには #fileNamed: メッセージを送ります。例えば

(FileDirectory default fileNamed: 'hoge.txt') edit

とすればデフォルトディレクトリ直下にある hoge.txt というテキストファイルを開いて(無ければ生成して)表示してくれます。編集も出来ます。

本題からそれますが、編集内容を保存するには 黄ボタンメニューから accept を選択すればOKです。

と言ったところでおしまい。ファイルについてはまた今度。