ゆの in 各種言語を Squeak Smalltalk で意訳 2


id:sumim:20080711:p1 の続きで Python 版、C++ 版、Io-language 版をさくっと。

ゆの in Python

Smalltalk ではクラス名と同名の変数は使えないのでクラス名を YunoPy に。

Smalltalk ではメソッドの返値はデフォで self なのでいちいち書くのは冗長ですが、返値を利用することがわかっているときは明示的に書いた方がよいようです。

いかにも Python な行儀正しさ。

Object subclass: #YunoPy
    instanceVariableNames: 's'
YunoPy >> / v
    (v isKindOf: Integer)
        ifTrue: [s := s,'スケッチ']
        ifFalse: [s := s, '365'].
    ^self
YunoPy >> < v
    Transcript cr; show: ('{1} {2}' format: {s. v}).
    ^self
YunoPy >> initialize
    s := 'ひだまり'
| X _ |
X := YunoPy new.
_ := 1.

X / _ / X < '来週も見てくださいね!!'

ゆの in C++

Smalltalk には構造体はないのでクラスで。名前にもアンダーバーは使えないので YunoCpp に変えてあります。

演算子の多重定義のみを用い、無駄な動きのないシンプルな実装ですね。

Object subclass: #YunoCpp
YunoCpp >> / other
    ^self
YunoCpp >> < string
    Transcript cr; show: 'ひだまりスケッチ365 ', string
| X _ |
X := _ := YunoCpp new.

X / _ / X < '来週も見てくださいね!'

ゆの in Io-language

Smalltalk はプロトタイプベース(aka インスタンスベース)ではないので、インスタンス特異的クラスで雰囲気だけ。

_ の値はなんでもいいので、同じオブジェクトにしちゃいました。宣言だけして未定義のままでも(コンパイラがぶつくさ文句を言ってきますが)とおります。

?() のような仕組みは表現しにくかったので、スロット called はあらかじめ用意しておき、それが未定義か否かで逃げました。

| X _ |
X := _ := Object new assureUniClass.
X class addInstVarName: 'called'.
X class compile: '/ other
    Transcript show: (called ifNotNil: [''スケッチ''] ifNil: [''ひだまり'']).
    called := true'.
X class compile: '< string
    Transcript show: ''365 '', string'.

X / _ / X < '来週も見てくださいね!'