プログラミング言語論 第5回
11/3
Programing Language
はじめに
前回おさらい
- puts gets を使ったオウム返しを繰り返し行うプログラムを作った
- あわせて、以下のような文法的基礎を学んだ
補足0 Windowsの独自事情
while gets do ...
を使ったプログラムについて、
- Rubyの実行方法について話したときに、
- 引数なしの ruby コマンドにソースを貼り付ける
- irb で実行
といった方法があることを伝えましたが、
- 上記のプログラムは、Windowsではうまく動かないようです。
- EOF の扱い( Ctrl-Z Enter
で伝える)についての想定外の動作のようです。
- Unix系OS( Ctrl-D でEOF)では動作しています。
ということで、この場面での回避策:
- エディタに入力し、ファイルとして(拡張子
.rbで)保存して、それを実行
という動かし方をして下さい。
バックスラッシュ
補足1 バックスラッシュ
- 右図のように、改行文字(後述;行末文字などとも呼ぶ)をプログラムで表現するときに
バックスラッシュ+n を並べたものが使われる。
- このバックスラッシュは、環境によっては
¥(円マーク、を半角にしたもの)と表示されることがあるが、
- 表示が違っていても、文字コードとしては同じものである。
- 日本でコンピュータが普及し始めた頃の苦肉の策が、
今も文字に関する歴史的事情として生き残っている訳だ。
- 詳しくは、円記号について
検索してみて下さい。
補足2
マニュアルを読むにあたって
主なメソッド
- リファレンスマニュアル(ドキュメント)のページ(バージョンは概ねどれでもOK)から入り、
組込ライブラリ(Builtin Libraries)のページを当面は使うことになる。
- クラス名#メソッド名 という表記があれば
そのクラスのそのメソッドのことを意味する。
(この #
を使った表記は、解説文などで慣例的に使われるもので、プログラムコードの中で
使われる文法要素ではない)
- 今日紹介する主な(着目すべき)メソッドとしては、
- String#size (String#lengthと異名で同機能)
- String#chomp または String#chop
- Array#join
- String#split
等がある。
- ページ中でメソッドの解説は原則としてメソッド名の辞書順
(アルファベット順と考えていい)に並ぶ。
ただし、length と size
のように同機能で別名を持つメソッドが一箇所に集まられる
ため、その部分では辞書順は乱れている。
- 例えば String#lengthの見出しでは、

length -> Integer
とある。この矢印の右側にはそのメソッドを評価した結果としての
値がどのようなクラスの値になるか、を示している。
クラスの階層について

- マニュアルの「組込ライブラリ」のページにはクラス名がずらっと縦に並んでいる。
先頭の BasicObject
以外の項目について、(微妙な幅だが)右に字下げされている
ことを意識しておくこと。上図左のように階層関係になっていることを示す。
- この階層関係は上図右のように表されることもある。
- 例えば Stringは
Objectの子クラスで、Objectは、BasicObjectの子クラス。
- ただし BasicObject は便宜上作られている特殊なクラスであり、
実質的には Object が最上位だと考えていい
(他の殆どのオブジェクト指向言語でも Object
がこの階層の最上位に位置する)
- クラスの親子関係の中にモジュール(組込ライブラリのページの下半分)が挟まるため、
継承関係(後述)はもう少し複雑になる。 例えば String
クラスのページ の上部に 「クラスの継承リスト: String < Comparable
< Object < Kernel < BasicObject」 とあるのを確認されたい。
3
プログラムの発展:文字列の操作
=> 別ページ参照
=>補足解説
課題
例題 e 各文字を3つずつ重ねる変形
|hello| -> |hhheeellllllooo|
を自分で作ってみて下さい。
(hint: Array#map (正しくは Enumerable#map だが)を使う)
まとめ
実演例
(別ページにまとめた)
補足6
プログラミングの考え方の広がり
作る・作らない
- プログラミングに限らず、ものを作る技術は、
- 部品レベルから自作していく
- 既成の(または特注の)部品を組み合わせて作る
という2つの考え方で (実際にはその両極端ではなく適度な妥協点で)
実現されるものである(右図)。
- プログラムを作る場合も同様に、 個々の機能を1から作る場合もあれば、
既成の部品を極力流用(借用したり買ってきたり)して作る場合もある。
- 開発効率やメンテナンスのコストといった観点からは後者の
アプローチが適しているが、その半面、
- コンピュータの性能を活かす必要があるなど、
厳しい仕様に適合するために(前者の)
部品からの自製も必要になることがある。

- この科目では前者の考え方に比重を置いて技術を紹介している。
- 使える部品(クラスやメソッド)を見つけ出す技術、
それらを組み合わせる技術、が問われる分野、ということになる。
- 例えば文字列を反転させる、という操作を、ここでは String#reverse
メソッドが利用可能だという前提で扱っている。
- もちろんその機能を実現するプログラムを作ることもでき、
様々な考え方で実現することができる(たとえば下図のような考え方)が、当科目のメインのコースでは扱わないのでご了解下さい。

(以下は今回はなるべく見ないでおきましょう)
例題の解答例
例題 a ~ d :
( while s=gets do puts s.chop..... end
の s
を変形する部分だけ ここにまとめておく )
# a
s.reverse
# b
s.split(//).join(' ')
# c
[s]*3*' '
# d
s.upcase