ウチの宅サバは PBG3 なんですが、もう5年以上動いているのでさすがに HDD がやばいだろうということで、換装までいかなくともいざというときに起動可能なバックアップ HDD(クローン)くらいは用意しておこうと思い立ったのが運の尽き。
結局まる二日かけて、Old World Mac の OS X 起動ディスクの複製はひとすじなわではいかないことを学んで終わりました。
ありがちですが、この作業の過程で使用中の HDD はみごとに壊れたので、結局、別の HDD への換装&システムの入れ替え作業と相成りました。bless が必要…というあたりまでは調べは付いたのですが、結局 Carbon Copy Cloner の該当機能もターミナルからの直打ちもNG。もう少し気合いを入れて調べればなんとかできたかもしれませんが、検証のために何度も何度も時間をかけて OS X をインストールしたり HDD を入れ替えたりする作業にうんざりして「これはまさしく時間の無駄というやつだな」と感じて急にむなしくなってやめにしました。
調査の過程で PBG3 でも XPostFacto なるソフトを使うことで Tiger まで動かせるとか分かって、世の中には Old Mac に愛を注ぐすごい人たちもいるのか…と感心させられたりもしてそれなりに収穫もありましたが、どーせ新しみがないなら Snow Leopard なんかより Windows 7 βのほうがよっぽど楽しみだと感じる Winっ子になった私としては、めっきりさび付いて久しい Mac 脳を酷使してひどく疲れました。
…することだけで、あとはほとんど Smalltalk から」で、FA。そうじゃないかなーとは思っていましたが、やっと裏がとれました。
- A behind-the-scenes look at the development of Apple’s Lisa
BYTE: Do you have a Xerox Star here that you work with?
Tesler: No, we didn’t have one here. We went to the NCC when the Star was announced and looked at it. And in fact it did have an immediate impact. A few months after looking at it we made some changes to our user interface based on ideas that we got from it. For example, the desktop manager we had before was completely different; it didn’t use icons at all, and we never liked it very much. We decided to change ours to the icon base. That was probably the only thing we got from the Star, I think. Most of our Xerox inspiration was Smalltalk rather than Star.
404 Blog Not Found:perl - で(Recall()|arguments.callee()|&?BLOCK()) と似たような方法で。
[:nn | nn < 2 ifTrue: [nn] ifFalse: [
nn * ((Compiler evaluate: thisContext decompileString) value: nn - 1)]
] value: 10 "=> 3628800 "
古いタイプの Smalltalk である Squeak Smalltalk のブロック(ブロックコンテキスト)は再入できないので、せっかく thisContext で無名関数(=ブロック)自身を得ることができても、それを再帰的に評価することができません。いったんコード文字列に戻して再コンパイルしてそうして得 られた新しいブロックに改めて value: nn - 1 を送っています。
流行っているみたいなので。
ただし、ふつうに書いてもつまらないので、例によって Smalltalk ならではの“はるか斜め上”に向かってかっ飛ばしてみました。w (#改訂:最初のバージョンはアホになるはずがなぜか気持ちよくなっていたので修正。加えて、複数の条件にも対応。)
▼コード
1から:40まで数えて:[(3の倍数 と:[3がつく数字])の時だけ:#アホに]なります
id:sumim:20080416:p1 の続き?
▼データ型にこだわるOO
ユーザー定義型へのこだわりといえば、メインプログラムさえも型で表現しようとする Java をおいて他にないでしょう。ありがちな「メッセージングにこだわる〜」からの“汚染”もほぼ皆無のようですし。次点で Eiffel …かな。
▼メッセージングにこだわるOO
もちろん、Smalltalk !…と言いたいところですが、残念(?)ながら、Smalltalk はアラン・ケイの手を離れて以降、急速に「データ型にこだわる〜」に汚染されてしまっています。しいて挙げれば、分家の子(OOPL ではない)ですが ACT1 かな。あえて Smalltalk にこだわるなら、Smalltalk-72 まではかろうじて。
▼オブジェクトと委譲のみからなるOO
元 祖的な存在の SELF は完全に「メッセージングこだわる〜」に汚染されているのでNG。「メッセージングにこだわる〜」を排除して生まれた嫡子の NewtonScript は、逆にクラスを入れてしまったので不適。そうすると結局、JavaScript くらいしか残らんか…。
id:sumim:20080415:p1 の続き?
▼データ型にこだわるOO → 南斗聖拳
広く伝承され、主立ったもので総勢一〇八派に分派している。また、有力流派から派生する流派(派生流派)も存在するため、流派の数はさらに増える(南斗聖拳 - Wikipedia より)。切り裂く技が共通(つまりこれが「ユーザー定義型」だな…)。
▼メッセージングにこだわるOO → 北斗神拳
一子相伝の暗殺拳である。1800年間他門に敗れたことはないとされ、戦いの中で奥義を見出し、常に進化を続ける点から「地上最強の拳」と呼ばれている。(北斗神拳 - Wikipedia より)。敗れたことはない…とか、最強…とかはファンじゃない人たちからは反感を買いそうだけど、「戦いの中で奥義を見出し、常に進化を続ける」なんての は「進化」を「変化」と読み替えれば、ぴったり。「身体を外部からではなく、むしろ内部から破壊することにある。」とはメッセージングか! ぐはっ。
▼オブジェクトと委譲のみからなるOO → 雲のジュウザの拳
「わが拳は我流 我流は無型!! 無型ゆえにだれにも読めぬ!!」 たしかに型はない。w 何者にも縛られない、自由なOO。
- http://d.hatena.ne.jp/sumim/20080413/p1#c1208228975
「OO(OOP)とは何か?」については、ネタが割れてしまえばそんなに複雑なものではない…と個人的には最近、考えるようになってきています。
* リスコフのユーザー定義型(aka、抽象データ型。データと手続きのセット)そのもの、あるいはその「ユーザー定義型」をクラスやそれに準ずる機能で実現しようとするOO(ストラウストラップ。aka、クラス指向。継承を使ったプログラミング)。もしくはそれらを一般化したOO(クック。aka、手続きによる抽象化)。
* メッセージングによる動的性を実現しようとするOO(ケイ。aka メッセージ指向)
* 今回登場した、後者のメッセージングのOOのミニマリズムをおしすすめることによって派生的に生じたOO(アンガーとスミスから派生。aka、プロトタイプベースOO。フレームとスロット、あとは委譲機構があれば十分…というミニマル化の結果、アンガーとスミスの頃には重要だった“メッセージング”というコンセプトすらそぎ落とされたのは興味深いですね!)。この三系統のOO、各々の本質を把握できていれば、それらの混成ということで、ほとんどのOOPLの機能や立ち位置、世にはびこる“俺OOP”の中身…はスッキリ説明できるはずです。
ということで、三つの系統のOOのそれぞれの本質を、ざっくりとですがまとめてみました。前にもなんだか 似たようなこと&今回と矛盾するようなこと を書いたような気がしますが大人の対応をお願いします(^_^;)。
- 404 Blog Not Found:タイプ・クラス・プロトタイプ - OOの語彙
クラスベースのOOとプロトタイプベースのOOで決定的に違うのは、プログラムを動かしている最中にオブジェクトが出来ること、すなわちメソッド(method)を追加したり再定義したりできるかだ。
これはひどい。w オブジェクトに対して動的(実行時)にメソッドやインスタンス変数を追加できることと、オブジェクトがそれが属するクラスによらず独自のメソッドやインスタンス変数を持てることとは別の話です。
文字列クラスのメソッド数比較 に絡めて。
両者の共通項については、以前すでに Ruby との文字列操作の比較 で列挙しましたが、今回は差異(特に Ruby からの視点で…)を意識して整理してみました。
とりあえず、両者共通の機能を持つメソッドを抽出してみるとこんな感じ(一部ちょっと無理がありますが…(^_^;))。
#length , #size -> #size #[] -> #at: #[]= -> #at:put: #+ -> #, #empty? -> #isEmpty #reverse -> #reverse #upcase -> #asUppercase #downcase -> #asLowercase #capitalize -> #capitalized #to_i -> #asInteger #to_str -> #asString #to_sym, #intern -> #asSymbol #each_byte -> #do: #each_line -> #linesDo: #include? -> #includes: #replace -> #become: #delete -> #copyWithout: #slice -> #copyFrom:to: #strip -> #withBlanksTrimmed #rstrip -> #withoutTrailingBlanks #lstrip -> #withoutLeadingDigits #chomp -> #withoutTrailingBlanks #chop -> #allButLast #rjust, #ljust -> #padded:to:with: #< -> #< #> -> #> #>= -> #>= #<= -> #<= #<=> -> #compare:caseSensitive: #casecmp -> #compare:
目を引くところでは、Ruby の String には Smalltalk の #become: に相当する #replace なんてぇのがあること。
逆になんだかなーと思ったのは、Ruby 1.8 の String クラスにはエラーを出さずに動きはするけれど、意味はなさないメソッド群(おそらく Enumerable から継承された…)が少なからず存在すること。なお、これらのメソッド群は、Ruby 1.9 では文字列に対しては使えなくなっています。念のため、Squeak Smalltalk で気持ち的に対応するであろうメソッドを括弧でくくって示してあります。
#each (-> #do: ?) #collect, #map (-> #collect: ? ) #select, #find_all (-> #select: ? ) #reject (-> #reject: ? ) #grep #detect, #find (-> #detect: ? ) #inject (-> #inject:into: ? ) #max (-> #detectMax: ? ) #min (-> #detectMin: ? ) #all? (-> #allSatisfy: ? ) #any? (-> #anySatisfy: ? ) #member? (-> #include: ? ) #each_with_index (-> #doWithIndex: ? ) #sort_by #sort (-> #sort ? ただし Squeak Smalltalk では破壊的) #entries (-> Array>>#withAll: ? ) #zip #partition
前置きはこのくらいにして、以下に本題。
大別すると、Ruby の Array がサイズ可変であることを利用したメソッドや、正規表現や tr(1) 形式のサポート、UNIX のコマンドに対応した便利メソッドなどが Squeak Smalltalk には欠けています。あと、Ruby には破壊的にサイズ変更操作を行なうメソッドが比較的充実しているように感じられました。なお、多言語文字列操作関連は省いてあります。
▼ サイズを変更するもの
Squeak Smalltalk の文字列はサイズ固定なので、レシーバ文字列それ自体に対してサイズを変更する操作はできない。
#<< #concat #insert #strip! #rstrip! #lstrip! #chop! #chomp! #delete! #slice!
▼ “連なるもの”の生成や #between?
Squeak Smalltalk には、連なるもの(継ぐのも)を生成したり、それへ置き換えるといった操作はない。また、Squeak Smalltalk の String は、Magnitude(Ruby でいうところの Comparable)を継承していないため Magnitude>>#between:and: は文字列に対しては使えない。
#succ #succ! #next #next! #upto #between?
▼ 変換操作など
#% -> #format: #dump #unpack #crypt #sum #* #center #hex, #oct -> #Number>>#readFrom:base: #to_f -> Float>>#readFrom: #swapcase #swapcase!
▼ 正規表現や tr(1) 形式を用いた検索、置換、変換操作
Squeak Smalltalk は正規表現や tr(1) 形式を受け付けないので、これらの操作はできないか類似の操作として限定される。
#gsub -> #copyReplaceAll:with: #gsub! #sub #sub! #match #scan #split -> #subStrings: #tr #tr! -> #replaceAll:with: #squeeze #squeeze! #tr_s #tr_s! #index -> #indexOf: #rindex -> #lastIndexOf: #count
▼ Squeak Smalltalk には破壊的操作版がないメソッド
#reverse! #upcase! #downcase! #capitalize!