「言語設計の基礎知識」本日発売!

僕が書いた特集記事「言語設計の基礎知識」が載っているWEB+DB PRESS Vol.60が本日発売になりました。

書店店頭でどっさり平積みになってました!

どんな特集?

第1章がまつもとさんに書いていただいた導入で、残りの2〜6章を僕が書きました。ざっくりとキーワードを挙げると:

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さん、ありがとうございます。