CAKE(6) FreeBSD Games Manual CAKE(6) NAME ふりぽけ日記 - 2001年08月下旬 SYNOPSIS cake [-vd] [garbage-in garbage-out] DESCRIPTION Cakeは駄文製造プログラムです。一般に、ゴミを入力するとゴミを出力す る、とされています。 OPTIONS なにも指定をせずに立ち上げると、標準入力(/dev/ear)から読んで標準出 力(/dev/mouth) に書こうとします。(放っておくと、ずっとそのままで入力を 待っています。)入力ファイルと出力ファイルを指定すると、それらを読み書き します。 -v オプションを指定すると、何をやっているのか細かく報告します。 -d オプションはデバッグモードです。 2001.08.20 Mon : 編上長靴紐問題 : それにしても気になるのが、 SmalltalkのパーサーはSmalltalkで書かれている という点。 やはり最初に簡単なインタプリタくらいは別の言語で書かないと、そもそも動か ないよねえ。青本とかには書いてあるのだろうか? え? VMコード手書き? PocketScheme : WindowsCE で動く Scheme 処理系 PScheme(http://www.angrygraycat.com/scheme/pscheme.htm) をげっちゅー。 これで社内^H^H車内 SICP ができるぞ。 ってSqueakは? (和訳:身体も頭脳もひとつじゃ足りません) Smalltalkの変数 : #どこかでだれかが「きぼーん」と書いていたような :D Smalltalkの変数は、大まかにいって3種類あると思う。 1.ローカル変数 これが一番分かりやすい。Smalltalkの(文法要素としての)programの冒頭部、 '|' で囲む部分で宣言される。(Rubyのブロックの記法にも受け継がれてる) Lispでいう (let (foo bar...) ****) の (foo bar...) にあたる。ただし初期化の構文はない。 バイトコンパイルされた結果を観察するに、ローカルのスタックフレームに宣言 した変数のぶんだけ領域が確保され、VMの命令では store local n push local n (nは0オリジンのインデクス)といった形で読み書きされるような気がする。 2.大域変数 Smalltalk という名前のオブジェクトがあって、これがシステム全体の大域辞書 になっている。エントリはシステム内の全クラス。Smalltalk 自体は SystemDictionaryクラスのソルインスタンス。(今風にいうとSingleton) つまり Smalltalk-80 レベルのアーキテクチャでは、クラス名は一つのグローバ ルな名前空間しか持てないということになる。(最新のVisualWorksとかではどー なっているか知らない) Smalltalk at: #fuga put: 'hoge'. とやって単なる大域変数として使えなくもないが気持ち悪いし恐いのでやっては いけない。(否定の否定の否定) 危険な賭じゃが、勉強のために敢えてやってみよう。(Cyborg G-chan風に) Smalltalk at: #hogehogehoge put: 1. "値のセット" Smalltalk at: #hogehogehoge "値の取り出し" => 1 hogehogehoge "直で叩いてみる" => 1 やはり、Smalltalk辞書に存在するエントリは、裸のシンボルをそのまま評価して も名前解決されるようだ。クラス名を書くとクラスの実体が返ってくるのはこの 辞書を検索していることが分かる。 Smalltalk辞書そのものはクラスではないが、上で「Smalltalk という名前のオブ ジェクト」と言ったその名前は、クラスと同じ名前空間内にある。 Smalltalk辞 書のエントリ #Smalltalk が自分自身を指しているからだ。 分かりやすく言うとこれがヘビの尻尾なんです。(<余計分かりにくいです。) ちなみに、 Smalltalk := nil. というハットトリック(ただし自殺点)も存在するらしい。:D 3.クラス・オブジェクトに関る変数 クラス変数、インスタンス変数、クラスプール変数(詳細不明)など。 Smalltalkでは「メンバ」はすべて protected で、「アクセサ」は慣習的に get がメンバ名と同じ、 set はメンバ名 + ':' となる。 aPerson name. => インスタンス変数 name の値を返す aPerson name: 'new name'. => インスタンス変数 name に文字列 'new name' を設定する あとずっと誤解していたのが、メタクラスというものは Integer のメタクラス、 String のメタクラス…というようにクラスの数だけ存在する、いわばクラスの 幽波紋スタンド のようなものらしい。(<どこが「いわば」じゃ) 今日みつけたCOOLなコード : Squeakより一部抜粋してお送りします。 | answer writer iter | answer := String streamContents: [ :strm | writer := [ :msg :doer | ms := [iter timesRepeat: doer] timeToRun. strm nextPutAll: msg,((ms * 1000 / iter) roundTo: 0.01) printString,' usec'; cr. ]. : iter := 1000000. writer value: 'empty loop ' value: [self]. writer value: 'modulo ' value: [12345678 \ 256]. writer value: 'bitAnd: ' value: [12345678 bitAnd: 255]. : ]. StringHolder new contents: answer; openLable: 'send/receive stats'. * 抜粋の仕方が分かりにくかったのでちょっと修正。[Tue Aug 21 20:14:09 2001] ブロックの実行にかかった時間を計測し表示するというメトリクス用のメソッ ド。こういう「手続きを渡して結果を報告させる」という書き方は Lisp方面の由 来だろうか。CやBASICばかりかじっていても到底でてこない発想だと思ったり。 全貌は、 Morphic-Remote>>CanvasEncoder class>>timeSomeThings をどうぞ。 ちなみに、 ','(カンマ)はSequenceableCollectionの連結メソッド(二項 メッセージ)だったりする。 2001.08.21 Tue : Binary Message is not a Operator. : Squeakで定義されている二項メッセージの一覧。 & * *= + += , - -= -> / // /= < << <= = == > >= >> @ \\ \\\ | ~= ~~ これを求めるためのプログラム。青木淳さんの Smalltalk Ideoms -- chapter2(http://www.sra.co.jp/people/aoki/SmalltalkIdioms/chapter2/Chapter2.htm#SmalltalkProgram) よりSqueakで動くようにちょっと修正。 | aCollection aStream | aCollection := Set new. Smalltalk allBehaviorsDo: [:each | aCollection addAll: each selectors]. aCollection := aCollection select: [:each | each numArgs = 1 and: [each isKeyword not]]. aCollection := aCollection asSortedCollection asArray. aStream := WriteStream on: String new. aCollection do: [:each | aStream nextPutAll: each asString; cr]. StringHolder new contents: aStream contents; openLabel: 'Binary Messages'. ^aCollection 昨日の string - stream - writer パターン(勝手に命名)に書き換えてみるのも 面白いかも。 soucesとchanges : Squeakの処理系には.soucesファイルと.changesファイルが存在する。 * VisualWorksでは.souと.cha どちらも、システム内のブラウザから参照するソースコードを、チャン ク(fileIn)形式でため込んでいる。 .soucesファイルはメジャーバージョンごとにリリースされるようだ。 SqueakV3.souces .changesファイルは、イメージファイルと対になっている。 Squeak3.0final.images / Squeak3.0final.changes 簡単に言うと、soucesファイルが幹で、changesファイルはブランチにあたる。 imageをsave as...で新しい名前で保存すると、世界が分岐する。 CVSなどと違うのは、changesが差分ではなく各世代をまるまる追記していく形を とっていること。イメージ中のバイトコードは、最新の当該ソース部分へのポイ ンタと関連づけて管理されているらしい。(どのレベルでかは不明) あと、ソースの変更だけでなく、Do itの履歴もChangesに記録される。 ChangeSet : もうひとつ似たものにChangeSetがある。 これは、今のところ僕はブランチのスナップショットと捉えている。ただのス ナップショットと違うのは、あるプロジェクトと関係する変更だけが抽出されて いるという点だ。 プロジェクトというのは見た感じWindowManagerのVirtualDeskTopの様に見える。 Smalltalkでのプログラミングは大小のウィンドウがたくさん散らかってしまいが ちなので、やることごとに作業場所を作って整理しておくのは大切だ。 で、その作業場所がプロジェクトで、中で行った変更トランザクションのサマリ が ChangeSetというわけだ。 なにかプログラムを作成したり、システムの拡張を行ったとき、プロジェクトの ChangeSetをファイルに落とせば、そのままパッチとして使うことができると思 う。 ChangeSetの閲覧 : 外部からもらってきたChangeSetファイルを、システムに適応せずに中を覗いて見 る方法。 以前 どうやるんだ?(d200108b.html#16-1) と思っていたやりかたが分かった。 open... => file list でファイルリストを開き、見たいChangeSetファイルを選 択する。 右クリックメニューから browse changes を選択。 でオッケー。あとは、調べたいメソッドを選択して右クリックから compare to current とか、select conflicts with *** とか、いろいろ。(まだ詳細はよく わからん) 2001.08.22 Wed : 最近 : すっかり "Squeakヒッチハイカーズガイド"と化しているな。 * 元ネタまだ一度も読んだことありませんごめんなさい。 Squeak VM C CodeGenerator : Smalltalk で書かれた Squeak VM のコードを C に変換するメッセージ式 Interpreter translate: 'interp.c' doInlining: true. ちなみに、変換もとのクラスは Interpreter と ObjectMemory。 Cのコードを生 成するクラスは CCodeGenerator。 それらのカテゴリは "VMConstruction-Translation to C"。 : : senders とか implementers とかで、どこから呼ばれているのか、なにを呼んで いるのか、ポンポン開いて参照できる。 ブラウザのすごさが分かって来た…。 って、VC とか Del とか、世間一般の IDE を知らないから比較できないんだけ ど。 デスクトップメニューの正体 : クラスは TheWorldMenu 。第一階層の生成式は TheWorldMenu>>buildWorldMenu 中身を見ると大体構造が分かる。 #('メニュー項目の文字列' (レシーバ #メッセージセレクタ)) 選択すると、レシーバにメッセージを送るというシンプルでカコイイ仕組み。 2001.08.23 Thu : うーん? : Smalltalk/Squeakスレ、立てたの誰だろう? そういえば「教えろやゴルァ」という言い回しで連想される人が約一名…。 2001.08.24 Fri : ProcessorScheduler : VM内のスレッドを管理するクラス。 唯一のインスタンスが Proccessor というグローバルな名前を持つ。 #これもなんだけど、実は最近のネタのほとんどがSMLからいただきもの。 Linux Japan : ナノカーネル萌え〜 マウス入力にウエイト : InputSensor>>waitButton に、50ミリセカンドのウェイトが入っている。 ザウ、モバなど非力なペンベースマシンでSqueakしている人は外すといいらし い。 [self anyButtonPressed] whileFalse: - [(Delay forMilliseconds: 50) wait]. + ["(Delay forMilliseconds: 50) wait"]. ^self cursorPoint ここではまるっきり消してしまったが、ビジーループになるっぽい気がする。 50 を 5 とかに減らしてみたほうがいいのかも? これは [SML:4286] より。 Squeakのためのフォントコンバータ : BDFFontReader class>>convertFilesNamed:toFamilyNamed:inDirectoryNamed: "This utility converts X11 BDF font files to Squeak .sf2 StrikeFont files." だそうで。 TTFontReader>>readFrom: aStream -> TTFontDescription TTFontDescription>>asStrikeFontScale: scale -> FormSetFonts "Generate a StrikeFont (actually a FormSetFont) for this TTF font at a given scale." 手順をもうちょっと調べてみよう。 2001.08.26 Sun : アラン=ケイ曰く : 「オブジェクトとは再帰的に組み合わせることのできる小さなコンピュータであ る」 だそうな。 2001.08.27 Mon : たとえば… : VisualWorksにできてSqueakにできないことの例:ブロックの再帰 | aBlock | aBlock := [:i | i < 1 ifTrue: [ 0 ] ifFalse: [ i + (aBlock value: i - 1) ]]. aBlock value: 10. ==> 55 ところで、再帰するためにわざわざ aBlock と名前をつけているが、 Y-combinatorみたいにしてブロックの名前を消すことはできるのだろうか? 2001.08.29 Wed : 続ブロック話 : [SML:2602](http://www.sra.co.jp/smalltalk/SML/2001-2827/mails/2601-2700/2602.txt) 参照。 もともとSmalltalk-80の仕様では[](ブロック)はBlockContextというクラス で、ブロック内のテンポラリ変数は局所化されておらず、外側のコンテキストか ら丸見えになってしまっていた。もちろん再帰不能。 市場環境で進化していったVisualWorksではそれがBlockClosureというものに置き 換えられ、ブロックがLisp系でいうところの真のクロージャとして使えるように なったそうな。 Smalltalk-80をベースに再スタートをきったSqueakは、まだそこまでたどり着い ていないということらしい。 SUnit : Squeak付属のテストユニット SUnit をいじりはじめる。 JUnitなどと同じはずだ がブラウザ越しに眺めるとちょっと勝手が違う。 2001.08.30 Thu : ParagraphEditor : MVCにおいてWorkSpaceなどのテキスト入力を司っているのはParagraphEditor。 dispatchOnCharacter: char with: typeAheadStream "Carry out the action associated with this character, if any. Type-ahead is passed so some routines can flush or use it." ここでコントロールキーなどの特殊機能を定義しているようだ。 キーバインドの変更や、例えばSKKのような独自IMEを実装するなら、このへんを 中心にオーバーライドする必要がある。 (詳細まで見ていないので曖昧な言い方になってるが ^^;) SEE ALSO Top(1), PocketBSD(1), シュミプロ(1), ぽめれちょう掲示板(3), きまたま日記(6), 過去日記インデックス(1) AUTHOR Cake(SHIMADA Keiki) BUGS IE 4.0 以降や Netscape Navigator 6 以降などよりも、単純な VT 端末やライン プリンタからの出力のほうが見やすいかも知れません。 この日記に書かれた内容が客観的に正しいという保証はありません。また、内容 が予告なく変更されることもあります。 Sorry, This page is English free. nroff nikki system 0.01 September 1, 2001 7