2004-01-01から1年間の記事一覧

このごろ、Web メールのメールボックスらしきリファラが多いと思ったら…

OOP

オブジェクトの広場の ML で熱いオブジェクト指向談義が展開されているのですね。1980 年代以降の OOD/OOA からすると、私の 1960 年代までさかのぼる オブジェクト指向(より厳密には OOP)の起源に関する研究(ぉぃぉぃ…)成果は、“古典”のひと言でうち捨て…

「Smalltalk ではメソッドはオブジェクトではない」の?

こんな感じの言及を幾度か見かけた記憶があるのですが、これって(少なくとも Smalltalk では)“メッセージはオブジェクトじゃない”と言いたかったのですよねぇ…。 いや、それだとメッセージという概念がそもそもない Eiffel で、おかしくなるか…。文脈的に…

SELF や Io の情報をググるには、

self や io では当然駄目なので、selflanguage とか iolanguage とかすると、ある程度(検索ヒットを意識した言及ページを)拾うことができます。SELF についてはさらに、_AddSlots: というプリミティブメソッドをよく使うので、これをキーにする("_addslot…

擬変数

self、super、thisContext、あるいは、メソッドのパラメータ変数やブロックのブロック変数が擬変数(変数のように使えるが、ユーザーが任意のオブジェクトを代入できない。つまり代入できない)であることは、 誰でもある程度、直感で理解できるものですが、…

純粋“オブジェクト指向”言語。ただしこの場合“オブジェクト指向”は (ry

OOP

ある意味“別格”の、つまり、メッセージ指向というパラダイムの有効性を検証するため(だけ)に作られた Smalltalk システムにおける Smalltalk 言語を除けば、個人的には、純粋オブジェクト指向言語と名乗ってよい言語は SELF くらいしか思い付きません。それ…

空だろうがなんだろうが

OOP

文字列は文字列であって、偽か真か以前に、真偽値 にすらなりようがない のように扱えることにそもそも違和感があり…と思うのは私だけでしょうか?w ま、Ruby の条件分岐はオブジェクト指向たることをハナから放棄しており(なお、ここでの“オブジェクト指…

die さんの PostScript 版を強引に (ry その2

無名関数を返さずに、かつ、メソッドにまとめてしまってよいならば、exit もでき、よりシンプルに書けます。 Object >> case: caseArray caseArray pairsDo: [: case : execBlock | (case = self or: [case = #else]) ifTrue: [^ execBlock value]] x挨拶s x…

die さんの PostScript 版を強引に (ry

die さんの PostScript 版 を Smalltalk で。ブロックからは exit できないんで、こねくり回していますが。w case xあいさつ case _ [: exp : array | | result | result _ nil. array pairsDo: [: e : b | (e = exp or: [result isNil and: [e = #else]]) …

Python の例を Smalltalk で強引に書いてみる

某所で Python を使って呈示されている例を移植してみました。でも、Smalltalk だとやっていることや意味は同じでも、雰囲気や使い勝手はがらりと変わってしまいますね。 mySwitch mySwitch _ PySwitch subclass: #MySwitch instanceVariableNames: '' class…

Squeak システムの Smalltalk で switch/case 式

某 Python スレに端を発した switch/case 文の話。ゲンゴァー未満の私は、どっちかというと Googler なのでw、検索で見つけたこちらのCamp Smalltalk の記事をパクって、Squeak システムの Smalltalk に組み込んでみました。 char char _ $b. ^ char switch…

Ruby の range は無限大を扱えるのか…

つらつらと ruby-talk などを眺めていてふと目に付いたこれで、 (0..(10.0/0)).member?(4)るっ、Ruby は 0 で割っても例外をあげないのか、ってか、range は無限大を扱えるのか…とちょっと驚いて試してみる。 1/0 #=> error 1.0/0 #=> Infinity 0..(1.0/0) #…

「継承はサブタイピングではない」[Cook90]

OOP

…のメモ。再帰的な型 T を、 T = µt.F[t]と書くとき、 T = µt.{a:int, c:t, b:t→t} T1 = {a:int, c:T, b:T→T, d:bool} T2 = µt.{a:int, c:t, b:T→t, d:bool} T3 = µt.{a:int, c:t, b:t→t, d:bool}で、 T1, T2 は T のサブタイプだが、T3 はそうではない(型 …

いろいろな意味

マシンパワーが、まだまだ圧倒的に足りない。 いろいろとありそうに思えましたが、結局はこれに行き着きますか(笑)。

はてな:スクイーク(Squeak)について教えてください。

個人的には大好きなスクイークですが、世間では知らない人のほうが多いのもまた事実。 フリーソフトだし、もっと広く使われてもいいような気がするのですが、なぜ一般的に広まらないのでしょうか? なにか理由があるのでしょうか? その辺の事情など詳しく知…

Python の deepcopy

…は、(古典的な)deep copy じゃない。という話を、某 Python スレにて。 import copy a0 = [[1, 2, 3]] * 3 a1 = copy.deepcopy(a0) a0[0][0] = 'hoge' a1[0][0] = 'fuga' print a1 #=> [['hoge', 2, 3], ['hoge', 2, 3], ['hoge', 2, 3]] print a2 #=> [[…

ソースはかりそめ

OOP

いつもの某 Ruby スレをながめていたら こんなの を見つけて(これとは直接は関係ないのですが)「ソースはかりそめ」の話は Ruby ではどうなっているのかなぁ…と思って試してみました。 class A def a; [1, 2, 3] end end a0 = A.new a1 = A.new a0.a[0] = …

#(1 2 3) から #(1 2 3 1 2 3 1 2 3) を作る

もっともエレガントな方法は? #(1 2 3), #(1 2 3), #(1 2 3)いや。そうじゃなくて…。orz (1 to: 3) inject: #() into: [: sum : mock | sum, #(1 2 3)] (1 to: #(1 2 3) size * 3) collect: [: idx | #(1 2 3) atWrap: idx] Array streamContents: [: s | 3…

今日気付いた Smalltalk と Ruby の(思想が)違うところ。

#(1 2 3) * #(4 5 6) "=> #(4 10 18) " [1, 2, 3] * [4, 5, 6] #=> error (0...3).collect {|i| [1, 2, 3][i] * [4, 5, 6][i]} #=> [4, 10, 18] #(1 2 3) * 3 "=> #(3 6 9) " [1, 2, 3] * 3 #=> [1, 2, 3, 1, 2, 3, 1, 2, 3] Array streamContents: [: s | 3…

両替プログラム その2

出力が逆順なのが気持ち悪かったので、Prolog と同じになるように手直し。 Integer >> factors: factors amplitudes: amplitudes ifFail: failBlock "27 factors: #(24 11 3) amplitudes: #(0) ifFail: [^ nil]" | amps factor newAmps rest newFail | amps …

Ruby に対抗して、Squeak でも負け惜しみ。

TokuLog! より、K A N O U . J P をうけての、「Ruby なら2行で書けます」に対抗して、Smalltalk なら1行で書けます、と。w (ま、Ruby も実質1行で、しかもはるかに短いんすけどね) *1 second asUnHtml withSqueakLineEndings convertFromWithConverte…

両替プログラム

2ちゃんの某 Prolog スレで、「両替の問題を解いてください.prolog始めて3週間で出た学校の課題です><; 」なんてのを見かけたので、Prolog の勉強を兼ねて書いてみることに。なんとかそれっぽくうごくコードにはできました。 factorize([F | Fs], N, As…

Groovy で BigInteger な fact

Groovy は整数リテラルが int ではなく Integer なのですね。 1.class #=> class java.lang.Integer 1 class "=> SmallInteger "でも、Integer.MAX_VALUE + 1 は Integer のままなので、 (Integer.MAX_VALUE + 1).class #=> class java.lang.Ineger (SmallIn…

A ><>>>>>><>>< B

某 Python スレの書き込みを見ていてふと。今のところ、これが一番スマート。 collection collection _ 'A ><>>>>>><>>'] whileTrue: [collection removeAll: '<>']. ^ String withAll: collection "=> 'A 大なり小なり部分だけを分離して、後で結合するタイ…

Strongtalk でワークスペーススクリプト

最適化されませんが、できます。おおしま さんのを拝借して。 | benchmark <[Int, [], ^Number]> fact <[Int, ^Number]> result <Number> | benchmark := [:n <Int> :c <[]> | (Time millisecondsToRun: [n timesRepeat: [c value]]) * 1000.0 / n]. fact := [:n <Int> | (2 to</int></int></number>…

Python vs Squeak

fact: 10 で測定しなおしてみました。Python は、khi さんのをお借りしました。 => Java: 0.131 MicroSeconds per call => Groovy: 120.1 MicroSeconds per call => Ruby: 66.0 MicroSeconds per call => Python: 11.8 MicroSeconds per call => Squeak: 13.…

ODECo 0.2

今週末の北海道マッキントッシュユーザー会の定例会でデモすることになったので、付け焼き刃的に(ぉぃ!)遅まきながら、勉強を兼ねて遊んでみました。ODE force field のパラメータ設定が(ってか、これだけしかないのに分からないことがあるオレって… orz…

Groovin' with Groovy

簡単なループのベンチマークのJava 版、Ruby 版 が載っていたので、早速手近なマシン(type U、1GHz)で、fact の引数を 100 に増やしたものを試してみました。 Java: 0.972 MicroSeconds per call Ruby: 899 MicroSeconds per call Java 、速すぎ(笑)。(追…

クロージャ vs オブジェクト

クロージャはこないだの台風並みに乱暴に言えば、無名関数で、関数ポインタで、無名内部クラスで、手続きを [ ] で括っただけのものだったりする一方で、アクター、ひいてはオブジェクトと理屈では等価なものだったりもするわけです。三段論法的には関数とオ…

Java の無名内部クラスとクロージャ

(ちょっと前のことになりますが)札幌ドームに向かう車中で、無名内部クラスの new にはクラスだけではなく、インターフェイスも使える(おおっ!…と一瞬、思ったけど、まあしくみを考えてみれば当たり前で、むしろ使えないほうがおかしいんですが)というこ…

さて問題です。この人は何をしたいのでしょう?

2ちゃんの某 Ruby スレで、当初思ったより盛り上がっているのを見て、ちょっと趣向を変えて悪ノリ。スクリプトから、元の問題を想像してみてください。以下は、すべて同じ問題を解決するために書いたものです。註:array などとして与えているのが、答えを…