Little Smalltalk v.1


前のエントリーでマニアックなハックとともに(^_^;)ご紹介させていただいた Little Smalltalk は v.3 で、比較的新しいものです(エントリー名を変更しました)。そのため、仕様が書籍で解説されているのとだいぶ異なります。タイトルから郷愁にかられてアクセスしていただいた方の中にも、記憶のものとちょっと違うな…と感じられた向きも多数おられるかと。


ならば書籍が出版された当時の v.1 はないのか…と探してみたところ、本家からは削除されてしまって久しいのですが、C User's Group が CD-ROM で配布していたものが Planet Mirror というサイトにかろうじて残っているのを見つけることができました。

229_01.zip 54102 10-03-89 Little Smalltalk, Part I, with bundled files
230_01.zip 83212 10-03-89 Little Smalltalk, Part II, with bundled files

http://public.www.planetmirror.com/pub/cug/vol_200/229_01.zip
http://public.www.planetmirror.com/pub/cug/vol_200/230_01.zip


少々、ビルドに手間取ったので、以下にメモ。

前準備と unbundle

まず、それぞれの .zip を展開し、FILE_ID.DIZ、SUBMIT.DSK、CG2xx_0I.001 以外のファイルをひとつのディレクトリにまとめます。ここでは、~/small.v1 にしておきました。


ファイル名が大文字で、本来 .bundle な拡張子が .BUN になってしまっていることと、改行が CR + LF なのを LF に変換します。UNIX(あるいは PerlRuby ...)使いならこの手の変換はお手のものでしょう(^_^;)。私は UNIX 力に乏しいので、SqueakSmalltalk で、こんなかんじのスクリプトを書いて済ませました。

| dir path entries |

dir := FileList2 modalFolderSelector ifNil: [^ self].
path := dir pathName, dir slash.
(self confirm: dir pathName, ' ?') ifFalse: [^ self].

entries := dir entries select: [:entry |
   (entry name select: [:char | char isLetter]) allSatisfy: [:char | char isUppercase]].

entries
   do: [:entry |

      | name newName inFile outFile |

      name := entry name.
      newName := name asLowercase.
      dir rename: name toBe: (name := name, '.original').
      (FileList suffixOf: newName) = 'bun' ifTrue: [newName := newName, 'dle'].
      newName = 'makefile' ifTrue: [newName := newName capitalized].

      inFile := FileStream oldFileNamed: path, name.
      outFile := FileStream newFileNamed: path, newName.

      [inFile atEnd] whileFalse: [
         outFile nextPutAll: (inFile upTo: Character cr)].

      inFile close. outFile close]

   displayingProgress: 'processing....'


以上の前準備を終えたら、sh unbundle でファイルを展開します。各 .bundle ファイルに対応するサブディレクトリが作られ、その中にファイルが入ります。


設定と make

次に、./parser/env.h を使用中の環境向けに書き換えます。手元の環境は OS X なので、次のようにしました。

# define TEMPFILE "/tmp/small.v1"
# define PARSER   "/Users/yourdir/small.v1/bin/parse"
# define PRELUDE  "/Users/yourdir/prelude/standard"
# define FAST     "/Users/yourdir/prelude/stdsave"
# define LIBLOC	  "/Users/yourdir/prelude"

./prelude/Makefile も次のように書き換えます。

PREPATH = /Users/yourdir/small.v1/prelude


最後に、make 中に必要になるようなので、PATH を ~/small.v1/sources に通しておきます。


以上の準備を終えたら、あとは make install でうまくゆくはず…なのですが、install は使えないとか最後の行がおかしいとか文句を言うので、それには都度、対処しました。


無事(というか、warning がいっぱい出るので、かろうじて?)ビルドが終わると ./bin/st で Little Smalltalk v.1 を起動できます。とりあえず、お約束の 3 + 4 で 7 が返ってくることを確認。

$ ./bin/st
Little Smalltalk
        3 + 4
7