K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]

新規投稿 | 開設者ホームページへ戻る | ヘルプ

[1399] 「プログラミング言語を作る」について
投稿者:名無しの読者
2009/07/20 15:43:49

前橋さま 「プログラミング言語を作る」を読ませていただきました。 前橋さまの本は「C言語 ポインタ完全制覇」から読んでいるのですが、 今回もおもしろい内容でした。 ところで、ミスプリントらしい部分を見つけました。 303ページの補足「ファイナライザというかデストラクタというか」の第1パラグラフに 「Javaならデストラクタ、C++やC#ならデストラクタというメソッドが呼び出されます。」 と書かれていますが、「Javaならファイナライザ、C++やC#なら・・・」の 間違いではないでしょうか? まだ、正誤表には載っていなかったようなので。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1400] Re:「プログラミング言語を作る」について
投稿者:(ぱ)こと管理人
2009/07/21 03:04:21

「名無しの読者」様 >「プログラミング言語を作る」を読ませていただきました。 >前橋さまの本は「C言語 ポインタ完全制覇」から読んでいるのですが、 >今回もおもしろい内容でした。 ありがとうございます。 >と書かれていますが、「Javaならファイナライザ、C++やC#なら・・・」の >間違いではないでしょうか? ご指摘ありがとうございます。正誤表に載せておきました。 普通に読んで変だと思う(たとえJavaやC++やC#をまったく知らなかったとしても!)であろう 文章であるにもかかわらず、チェック時に見落とすとは、人間の思い込みとは 侮れないものです……
[この投稿を含むスレッドを表示] [この投稿を削除]
[1401] Re:「プログラミング言語を作る」について
投稿者:名無しの読者
2009/07/21 21:32:14

もう一つ間違いとは言い切れないのですが、気になったところがあるのでついでに書いておきます。 P85の補足「各言語のグローバル変数の扱い」のPerlの部分に「localとかmyとかを付けて宣言するとローカル変数となる。」とあります。 しかし、Cやjavaをおもに使っている人にとってlocalがローカル変数というのはかなり違和感があると思います。 例えば、localを使った次のようなプログラムだとおかしな結果になります。 =============================================================== #!/usr/bin/perl $hoge = "global"; &func_local; &func_my; sub print_hoge { print "hoge is $hoge\n"; } sub func_local { local $hoge = "local"; print "func_local: "; print_hoge; } sub func_my { my $hoge = "my"; print "func_my: "; print_hoge; } =============================================================== 上記のプログラムを実行すると出力結果は func_local: hoge is local func_my: hoge is global になります。 myをつけた変数はCのローカル変数と同じように使えますが、localをつけた変数はCのローカル変数とは違います。 ちなみに、「初めてのPerl 第3版」の4.7 local演算子には「しかしlocalという名前は間違っています---あるいは、少なくとも、誤解を招く名前です。(中略)そうです、local変数と呼ばれる変数の正体は、実はグローバル変数なのです!」と書かれています。 myがない頃はlocalが使われていたそうですが、なぜmyより先にlocalが作られたのでしょう? 実装が楽だったとかなのでしょうか。 Cより新しい言語なのにCと同じローカル変数が使えなかったというのはどうなんだ・・・。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1402] Re:「プログラミング言語を作る」について
投稿者:(ぱ)こと管理人
2009/07/22 02:58:59

>P85の補足「各言語のグローバル変数の扱い」のPerlの部分に「localとかmyとかを >付けて宣言するとローカル変数となる。」とあります。 >しかし、Cやjavaをおもに使っている人にとってlocalがローカル変数というのは >かなり違和感があると思います。 確かにPerlのlocalはダイナミックスコープですから、CやJavaのローカル変数とは 挙動が異なります。とはいえグローバル変数とも明確に違うものだと思います。 以下のサンプルで、きっぱり再帰できていますし。 ================================================== &hoge(0); sub hoge { my $depth = shift; #print 'depth..' . $depth; if ($depth > 2) { return; } local $i; for ($i = 1; $i <= 3; $i++) { print ' ' x $depth . '$i..' . $i . "\n"; hoge($depth + 1); } } ================================================== 私の感覚だと、ダイナミックスコープの変数は、自分自身とそこから呼び出された 関数からしか見えないという点でローカルだと思うのですが、確かに単に 「localとかmyとかを付けて宣言するとローカル変数となる。」とだけ書いて しまうのは確かに乱暴かもしれません。まあでもここはPerl, Ruby, PHPそれぞれの 言語の特徴をさらりと書いているだけのところなので、正誤表に載せるような ことではないのでは、と思います。 後日、補足記事をWebに上げようかと思います。 >myがない頃はlocalが使われていたそうですが、なぜmyより先にlocalが作られた >のでしょう? 過去のある一時点において、多くの人が「ダイナミックスコープかっこいい!」と 思ったことがある、ということなのではないでしょうか。 http://hagi.is.s.u-tokyo.ac.jp/pub/essay/hagiya/h/tensai | 僕は、Schemeの開発こそ、コンピュータ・サ | イエンスの典型的なセンスの一つではないかと | 思うのである。それまでは、LISPの考案者 | McCarthyのまやかしともいえる「変数の動的な | スコープ」に、皆がだまされ続けていたわけで | ある。 http://www.rubyist.net/~matz/20041025.html#p01 | 歴史的にはLispは(少なくともインタプリタ処理系では)、ダイナミックスコープが | 当たり前だったのだが、SchemeやCommonLisp以来すっかりスタティックスコープの | 言語になってしまっている。ダイナミックスコープなら外側のローカル変数もごく | 自然に見える。変数名の重複にだけ気をつければ良い(そういう意味ではcondやcommの | ようなありふれた引数名は良くない)。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1407] Re:「プログラミング言語を作る」について
投稿者:名無しの読者
2009/07/22 20:51:40

>確かにPerlのlocalはダイナミックスコープですから、CやJavaのローカル変数とは >挙動が異なります。とはいえグローバル変数とも明確に違うものだと思います。 確かにその通りのようです。 >>myがない頃はlocalが使われていたそうですが、なぜmyより先にlocalが作られた >>のでしょう? > >過去のある一時点において、多くの人が「ダイナミックスコープかっこいい!」と >思ったことがある、ということなのではないでしょうか。 そういう歴史があるとは知りませんでした。 わざわざ回答してくださってありがとうございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1409] Re:「プログラミング言語を作る」について
投稿者:(ぱ)こと管理人
2009/07/23 02:11:11

>>確かにPerlのlocalはダイナミックスコープですから、CやJavaのローカル変数とは >>挙動が異なります。とはいえグローバル変数とも明確に違うものだと思います。 >確かにその通りのようです。 一応、「プログラミング言語を作る」では、p.153にて、本当にちょっとだけ ダイナミックスコープの説明をしています。お気づきかもしれませんが念のため 補足します。 今読み返すと、ここでのCRB_LocalEnvironment構造体のnextメンバが何を 指しているのかわかりにくいような気がします…… ここでのnextは、 呼び出し元のCRB_LocalEnvironment構造体を指しています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1410] Re:「プログラミング言語を作る」について
投稿者:名無しの読者
2009/07/26 21:09:33

プログラミング言語を作るをもう一度読んでいて2つミスプリントを見つけました。 p106 3-3-3「解析木の構築---corwbar.yとcreate.c」の第5パラグラフに 「アクションにて、crb_crete_binary_expression()」とありますが、 「アクションにて、crb_create_binary_expression()」だと思います。 p189 補足「別のあるべき姿---Code Set Independent」の最後から3つめのパラグラフに 「それに対し、CSIだと(N-1)必要になります。」とありますが、 これではUnicodeに正規化する方法よりエンコーディングを変換するコンバーターが少なくなってしまいます。 (N-1)はN(N-1)の間違いでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1411] Re:「プログラミング言語を作る」について
投稿者:(ぱ)こと管理人
2009/07/27 03:09:48

この週末は、土曜の夜からなんだかまぶたが腫れ上がってましてほとんど寝てました (医者には行って薬ももらいましたが、原因は不明です)。 反応が遅れましてすみません。 >プログラミング言語を作るをもう一度読んでいて2つミスプリントを見つけました。 > >p106 3-3-3「解析木の構築---corwbar.yとcreate.c」の第5パラグラフに >「アクションにて、crb_crete_binary_expression()」とありますが、 >「アクションにて、crb_create_binary_expression()」だと思います。 > >p189 補足「別のあるべき姿---Code Set Independent」の最後から3つめのパラグラフに >「それに対し、CSIだと(N-1)必要になります。」とありますが、 >これではUnicodeに正規化する方法よりエンコーディングを変換するコンバーターが少なくなってしまいます。 >(N-1)はN(N-1)の間違いでしょうか? たびたびすみません。ご指摘ありがとうございます。 正誤表に追加しました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1412] Re:「プログラミング言語を作る」について
投稿者:名無しの読者
2009/07/27 20:28:42

>この週末は、土曜の夜からなんだかまぶたが腫れ上がってましてほとんど寝てました >(医者には行って薬ももらいましたが、原因は不明です)。 >反応が遅れましてすみません。 いえいえ、十分反応は早いですよ。 最近の投稿の時間を見ると夜中の3時前後・・・。 余計なことかもしれませんが、あまり無理をなさらずに。 ご自愛ください。
[この投稿を含むスレッドを表示] [この投稿を削除]