「言語設計の基礎知識」本日発売!
僕が書いた特集記事「言語設計の基礎知識」が載っているWEB+DB PRESS Vol.60が本日発売になりました。
どんな特集?
第1章がまつもとさんに書いていただいた導入で、残りの2〜6章を僕が書きました。ざっくりとキーワードを挙げると:
- 第1章 言語設計者の視点から見える新しい世界(まつもとさん)
- 第2章 プログラミングの歴史 プログラミング言語は何のため? プログラミング言語は人間が作った
- 第3章 文法の発展 文法はなんのため? FORTH Lisp 構造化プログラミング 関数
- 第4章 変数とスコープの歴史 変数はなんのため? 名前の衝突 有効範囲をわけよう 動的スコープ 静的スコープ ネストした関数 単一代入 クロージャ
- 第5章 オブジェクト指向の歴史 オブジェクトはなんのため? ALGOL モジュール PerlのOOP ハッシュ JavaScriptのOOP クラス C++のOOP SmalltalkのOOP クラスが持つ3つの役割
- 第6章 継承に対する3つの考え方 多重継承 またしても衝突(菱形継承) 単一継承 C3直列化 ミックスイン トレイト
- 欄外コラム プログラミング言語版イノベーションのジレンマ(なぜC言語のシェアは失われたか) 他
P.17-54の全37ページの特集です。
正誤情報
間違いを入れないように気をつけたはずなのですが、それでもやっぱり間違いがありました。ここではどう間違っていたかを解説します。
P.33 動的スコープの解説
P.33に「(1)のlocal宣言はこの件に関しては無力です」と書かれていますが、これは間違いでした。当初この章の説明を書いていたときにはコードに(1)の行は無かったのですが、後で(1)の行を付け加えた後に動作確認を忘れたようです。なのでこの行はコメントアウトして説明を読んだほうがわかりやすいかと思います。
さて、(1)の行を付け加えてしまったことで何が変わったのでしょうか?実際にコードを実行してみるとわかりますが「Use of uninitialized value in concatenation (.) or string at dynamic.pl line 14.」というエラーになります。初期化されていない$xに別の文字列を結合しようとしたというエラーメッセージです。
Perlのlocal $x;は、単に新しい対応表を作るだけではなく、$xとundef(未定義値)を結びつけます。ところが筆者は単に新しい対応表を作るだけだと勘違いをしていたので、local $xの無いバージョンの挙動(下図)と
local $xを付け加えたバージョンの挙動(下図「誤」)は同じだと思ってしまいました。実際には下図「正」のようにundefがsetされているので参照したときに見える値もundefになります。
ご指摘いただいたid:gfxさん、ありがとうございます。