Re: IS演算子の必要性 ( No.4 ) |
- 日時: 2007/06/20 14:16
- 名前: よねKEN
- #魔界の仮面弁士さんのレスとかぶりまくりですが、せっかく書いたので投稿しときます(^^;
Isと(比較演算子としての)=は同じ比較演算子ですので、同じ文脈で使われます。 そのためIsを単純に=で代用するという言語仕様にはできません。
Class Aの変数aと変数Xを比較する場合、以下のような2種類の比較ができます。 (1) If a Is X Then (2) If a = X Then
それぞれの意味は、
(1)は変数aとXが指すインスタンスの参照が同一かどうかを判定します。 (2)は変数aの指すインスタンスの値と変数Xの指すインスタンスの値が同一かを判定します。
というように異なるものですので、2パターンを区別することができる必要があります。 今は、Isと=というキーワードの違いから判別できます。 これを単にIsを使わない(=を使う)とした文法ではその区別ができないため、 Is→=と変えた場合には、別のキーワードの導入など何らかの文法上の変更が必要になります。
代入の「=」とは同じ文脈で使われることはないので、 比較の「=」と確実に区別ができます。(できるように言語が設計されています)
>>ダンボさんであれば、どのような言語実装がなされれば、違和感を感じなくなりますか? >違和感なので強い根拠がないのです。「Is 比較では False だが、= 比較では True となる場合」 >も思いつきませぬ。「違和感」と呼んだのは下記と同列(統一性の欠如)で、
先の例で言うと「a Is X はFalseだが、a = X はTrue」な例ですが、 Class Aを人間クラスとして以下のように定義したとします。 Public Class A Public 身長 As Integer Public 体重 As Integer End Class
変数aは鈴木さん(身長170、体重60)、変数Xは田中さん(身長170、体重60)だとすると 同一人物ではないので、a Is X はFalse、 身長、体重という観点からは同一なので、a = X はTrueになります。
実際にはクラス同士はデフォルトでは「=」で比較できませんので、 演算子のオーバーロード機能により比較演算子「=」をオーバーロードしてやる必要がありますが。
>[BASIC] =に算術演算子と論理演算子の2つの意味を持たせたのはかなりひどい言語設計誤り。
代入演算子と比較演算子ですよね? 他の言語ではまた違った方法を採用していることの多い部分でもありますので、 言語設計者の影響の受けた言語や考え次第なところはありますね。 でも、誤りとは言えないと思います。
>[BASIC] 演算子に「記号」と「予約語」が混在している。+、=、&、AND、NOT、MOD
逆に記号ばかりを突き詰めた言語やなるべく 英語で表現できるようにした言語などいろいろありますね。 何が正解というのはありません。
個人的にはVBでのその辺のバランスはMod以外はよいかなと思っています。 全部、英語だと長すぎるし、全部記号はわかりにくいですから。 (記号の数は限られているので)
>[VB6.0] 上記2思想を踏襲するなら、参照の代入の場合も Set A = Nothing ではなく Let A Is Nothing にすべきだったのでは?
この辺はLetそのもののセンスがよくわからないのと(大昔のBASICでもLetを書いたことは一度もない)、 そもそもSetを用意した理由もよくわからない(たぶんVariant型が存在するためだろうと思うのですが)ので、 何とも言えないですね。
代入の=と比較の=は、言語設計上は区別する必要性は高くないのですが、 Pascalのように「:=」と「=」で区別している言語もありますね。 その点では元々のBASICの「Let」は「:=」の「:」の役割を意図したものだったのかもしれません。
>[VB.Net] 代入のときは=で統一できたのに、比較の時には=とISを使い分けるの?何で統一できないの?
VB6以前でも言語設計の観点からは「Set」は絶対に必要というものではなかったように思います。 ただ、Setがあった方がコンパイラの開発はずいぶん簡単になるので必須としたのでしょう。
VB.NETになって、すべてはオブジェクトとなった時点で、統一できたというより、 すべてが「Set a = X」の形になったから結果として「Set」が不要になったのだと思います。
代入と比較の=を統一できる理由、Isと=を統一できない理由は先頭に書いた通りです。
|
|