ゆの 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 < '来週も見てくださいね!'