Smalltalk-72で学ぶOOPの原点:あらためて「Hello, World!」と文字列操作
アラン・ケイの“オブジェクト指向”というアイデアをもとに(非同期処理などいろいろ足りていないながらも──)比較的忠実に実装された1970年代の非常に古いSmalltalk-72で遊んでみるシリーズです(なお最新のSmalltalkについては Pharo などでお楽しみください!)。他の記事はこちらから→Smalltalk-72で学ぶOOPの原点 Advent Calendar 2019 - Qiita
(文字列操作…の前にクラス定義についてからの続き)
文字列の表示
文字列クラスstring
の定義を再掲します。
このprint
の定義を読むと文字列を表示する方法は(REPLで、文字列に限らず、直前に評価した結果を自動的に出力する振る舞いを除けば──)2つあることがわかります。
ひとつは、文字列に対してprint
メッセージを送ることで、もうひとつはそのprint
を受け取ったときの振る舞いに書かれているようにdisp
というオブジェクトに対して← <文字列>
というメッセージを送る方法です。やはりコードを読むことで分かるように、両者は同じではなく、前者は文字列の前後を'
(クオート)で括って出力します。
なお、残念ながら「!」(エクスクラメーションマーク)はそのままキーをタイプしても⇑
(リターン)が表示されるだけで入力できないので、とりあえず前者の方法では今は諦めます。後者の方法では、文字列の代わりに数値を送ることで文字を出力できるようなので、「!」のグリフが割り当てられている17
を送ることで対応しています。
参考まで、0から127までのコードの文字には次のようなグリフが割り当てられているようです。
上で使ったdisp ← <文字列>
やdisp ← <文字コード>
で文字列や文字が出力できる他に、print
のコードを読んでいて気がつくのは、文字列に[<開始位置> to <終了位置>]
を送ることでRubyのように部分文字列を取り出せる機能があることや、さらにfind first <文字コード>
を送ってコードで指定した文字の位置を知ることが出来る機能があること、そして、これらの定義がstring
には見当たらないことです。
どうやらクラス変数substr
がこの謎の鍵を握っているようですがこれについてはまた改めて。
文字列の結合
今のSmalltalkでは文字列や配列の結合は,
(カンマ)を使いますが、Smalltalk-72ではRubyなどと同様に+
を使うようです。もちろんこれは演算子ではなく、+ <結合したい文字列>
というメッセージです。
ただ、下に再掲したvector
の定義を見ると分かるように、配列には+
による結合は定義されていないので、このメッセージが使えるのは文字列だけであることがわかります。
ちなみに配列の操作にはvecmod
という専用のアクションが用意されています。これについてもまた別の機会に。
(継承が…ない!(クラス変数の利用)に続く)