[View] [Edit] [Attachments] [History] [Home] [Changes] [Search] [Help]

作業記録

続きは、
http://d.hatena.ne.jp/propella/

2003-07-21


SmaCC 版言語ゲーム (SmaCCToys) を何とか今月中にリリースしたいともがいているが、
以前分かっていながら放ったらかしにしていた本質的問題にやはりぶち当たり難儀している。
その問題とは、パーサジェネレータが機能を生成する物なのに対して、SqueakToys の世界は
実物を扱う物だと言う事。これは、クラスとインスタンスの違い、抽象と具象の違いと
同じ事だ。

SqueakToys が見かけオブジェクトベースを指向しているという事に対して、特に
深く考えた事がなかったのだが、前から作っていて感じていた気持ち悪さは、やはり
この世界観を無視し得ないという事に関わっていた。つまり、SqueakToys の世界は
具体的な一度コッキリの「この物」に対してあれこれ操作するのが本質であり、
これが子供たちへの親しみやすさに繋がっている事だ。

一方では、Smalltalk の世界、 SmaCC の世界はクラスベース、つまり「ある物」に
関する物だ。この世界で表現される物は抽象的であり、いくつものありえる事柄を
ひとくくりに纏めて行くことによって世界を表現する。危うくうつろげなオブジェクトの
世界とは違って、クラスの世界は確実ではっきりしていて、はっきり行って僕はこっちの方が
好きだ。(だから SqueakToys になじめないでいる)

システムを作るという作業、そして広く捉えると科学を学ぶという作業は、個々の
具体的な出来事から、一般的な法則を抽象する事だ。今回の僕のテーマはまさにそこに
あるので、SqueakToys になじめないなんて言ってないで、この間に上手い掛け橋を
作るにはどうしたら良いかという事をかなり用意周到に考えないといけない。

そこでさらに妄想は膨らむ。オブジェクトの世界。限定された具象の世界を自然数の世界。
クラスの世界。抽象化された世界を実数の世界と比喩的に見る事が出来るのではないだろうか。
もしも我々の精神世界に具象物しかなければ、それは数え上げる事が出来、すべて有限の自然数で
表す事が出来る。という事は我々の知能は有限オートマトンと同一の能力しか必要が無いと
言う事になる。しかし抽象化によって、我々は変数を導入し、再帰的に無限を表現する事も
出来る。これは実数の世界であり、チューリングマシンの出番である。

ここで問題なのが、何故我々は有限の知識を用いて無限の抽象を表現できるのかという事だ。
これは工学的には計算可能の問題。生物学的には1次元のDNAから3次元の生命を生み出すしくみの
問題とリンクしている(だから妄想だって)。という事でクラスとオブジェクトの問題は
単にコーディング技術のみならず、我々の知的活動に本質的なテーマであると言える。

ちなみに、いま僕はいわゆる対角線論法というものに対して、大いなる疑問を抱いている。
対角線論法というのは自然数と実数の濃度が違うという事を証明する物だが、前提としている
暗黙の了解事項が多くて胡散臭い気がする。この証明は本当に大切な物なんだからもうちょっと
直感的に分かりやすい証明を工夫した方が良いんじゃなかろうか?

便利なテク。纏めてパッケージをインストール


#(
'Monticello'              "??"

'SendTreeExplorer'        "メッセージをトレース"
'EventInterceptorMorph'   "Morph イベントをトレース"

'TracingMessagesBrowser'  "見やすいMessageBrowser"
'Browser Reduction'       "ブラウザを沢山開かない?"
) do: [ :each | SMSqueakMap default installPackageNamed: eack ].


2003-07-16

[未]SmaCC を日本語で動かしたい。


Expression :
Expression 'expression' "+" Number '数' {expression + 数} | Number 'number' {number} ;
Number : 'numberToken' {numberToken value asNumber} ;
やはり動かない。。。

[済]エクスプローラに alt+i ショートカットをつける

PluggableListMorph や SimpleHierarchicalListMorph でキーが押された時、デフォルトで #arrowKey:from: がモデルに送られる。
'From Squeak3.5 of ''11 April 2003'' [latest update: #5180] on 16 July 2003 at 11:57:55 am'!

!ObjectExplorer methodsFor: 'as yet unclassified' stamp: 'tak 7/16/2003 11:53'!
arrowKey: aChar from: view
	(Inspector
		inspect: currentSelection withoutListWrapper) toggleIndex: 1;
inspectorKey: aChar from: view
! !

!ObjectExplorer methodsFor: 'as yet unclassified' stamp: 'tak 7/16/2003 11:46'!
explorerFor: anObject
	| window listMorph |
	rootObject _ anObject.
	window _ (SystemWindow labelled: self label) model: self.
	window addMorph: (listMorph _ SimpleHierarchicalListMorph 
			on: self
			list: #getList
			selected: #getCurrentSelection
			changeSelected: #noteNewSelection:
			menu: #genericMenu:)
		frame: (0@0 corner: 1@0.8).
	window addMorph: ((PluggableTextMorph on: self text: #trash accept: #trash:
				readSelection: #contentsSelection menu: #codePaneMenu:shifted:)
					askBeforeDiscardingEdits: false)
		frame: (0@0.8 corner: 1@1).
	listMorph autoDeselect: false.
     ^ window! !


[済]問題: ある値を常にモニタするテキストの作り方

(InfoStringMorph on: [Time millisecondClockValue]) openInWorld


[済]step の仕組み

Morph>>openInWorld の際に、
PasteUpMorph>>startStepping: が呼ばれ、その際実行メッセージとして #stepAt: が登録される。
この情報は StepMessage にカプセル化される。
StepMessage 
	scheduledAt: 次に実行される時刻 (Time millisecondClockValue 形式)
    stepTime: ステップ間隔、nil なら対象モルフの stepTime が呼ばれる
    receiver: 対象モルフ
    selector: 対象メッセージ
    arguments: 引数(なければnil

WorldState>>runLocalStepMethodsIn が World 内の StepMessage のリスト(ヒープ)から一つ取り出し、
Morph>>stepAt: が Morph>>step や Player>>stepAt: を呼び出す。
SystemWindow>>stepAt: ならモデルの stepAt:in: を呼び出す(インスペクタで使う)


もう少し詳しく step の動作をカスタマイズしたい場合
Morph>>startStepping:at:arguments:stepTime: を使う
例: self startStepping: #update: at: Time millisecondClockValue arguments: #(getListSel) stepTime: 10
(10ミリ秒ごとに、self update: #getListSel が実行される)

SystemWindow の場合は model にも更新の設定をかける
Object>>stepTimeIn: 更新間隔
Object>>stepAt:in: 実行内容
をオーバーライドする

注意点: step 機能は world に登録された後でないと動かない

[済]リストを使って現在のヒープを分かりやすく表示してみよう

上記の機能を駆使して作ったもの。ヒープと言うのはあらかじめソートされてある
能率の良いコレクションの事です。
StepList.st

[済]インスペクタの仕組み

Morphic 環境において、インスペクタは特定の間隔でずっとその対象を
観察しつづけている。上記 Object>>stepTimeIn: Object>>stepAt:in: の仕組みを利用している

selectionUpdateTime 文字列の場合は0, 複雑なオブジェクトの場合は前回表示に費やした時間(Inspector>>toggleIndex:)

更新は self changed: #contents から PluggableTextMorph>>update: によって行われる。
ここで、changed: の引数と同じ名前のメッセージがモデルに送られる。

[未]エクスプローラに alt+i ショートカットをつける


[未]色名と色の対応表 Color なんとか


2003-07-14

キーバインディングの勉強
ローカルに swiki
ツリー状にブラウズできるシステム
stepping?

インスペクタの動きを調べる
しょっちゅう値が変わるモルフ ClockMorph をインスペクトしてみる。
Inspector openAsMorphOn: (ClockMorph new) withLabel: 'test'

Inspector のインスタンス変数
contents: 表示内容文字列
object: 表示対象オブジェクト
selectionIndex: 選択中の場所

WorldState の stepList に実行すべき命令が書いてある
WorldState>>stepListSortBlock が優先順位を決める?

自分用ファイル置き場2

Link to this Page

propella home