- PR -

1行に代入文2個 これは何?

投稿者投稿内容
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-03-02 17:44
いげ太さんのおっしゃる件については

引用:

nagiseさんの書き込み (2007-03-01 14:46) より:
演算の過程において、hogeが2の初期値を持つのであれば、
hoge + 1が 2 + 1となり、それがhogeに代入され、3となり、
object氏のいうところの表裏一体の==をもちいて
3 == 2 + 1 は真となる。
変数をその瞬間の実値に置き換えて考える以上はobject氏は正しい。



と同意していますよ。
その上で、object氏が提唱している件について

引用:

nagiseさんの書き込み (2007-03-02 14:04) より:
「その一文は、実行可能なドキュメント」という考えはよいと思いますよ。
コードそのものが可読性の高いドキュメンテーションになっているとすれば
これほど理想的なものはありませんね。

ですが、実際には「明示」になっていない。
コードの動きを理解したうえで注意して読み解かなくては誤解する恐れがある。
そこに問題があることが先の私の投稿で指摘してあるわけです。



と問題を指摘しているわけです。
いげ太
常連さん
会議室デビュー日: 2004/10/27
投稿数: 32
投稿日時: 2007-03-02 18:15
なるほど失礼いたしました。読み解きが足りなかったようで。
数学によって展開した理論が数学的な「明示 / 言明」に至ってないことが問題、
と指摘されているわけですね。
ラフィン
ぬし
会議室デビュー日: 2002/05/23
投稿数: 809
お住まい・勤務地: 外野
投稿日時: 2007-03-05 23:14
>object さん

お久しぶりです。
あいかわらずですね

引用:

objectさんの書き込み (2007-03-02 12:20) より:

そして、「=」は、簡単に言えば、
最終的な「右辺値」の「左辺値」への一度限りの処理ですから、


「hoge = hoge +0.1」
hoge が整数型で値が 2 の場合、最終的な右辺値は 2.1 で、それを 2 に変換するのは「=」じゃないんでしょうか?

右辺は原因、左辺は結果。
なので、

引用:

objectさんの書き込み (2007-02-27 11:10) より:

「代入」という意味より「等しい」という意味であり、


「等しい」より「代入」の方がしっくりくるんですけど..
「代入」の裏は「等しい」であったとしても、「等しい」に裏はないですから。

『「代入」という意味より「等しい」という意味』にはもっと深い何かがありますか?
object
ぬし
会議室デビュー日: 2002/03/20
投稿数: 338
お住まい・勤務地: 香川県高松市
投稿日時: 2007-03-06 13:20
objectです。

>ラフィンさん
>「hoge = hoge +0.1」
>hoge が整数型で値が 2 の場合、最終的な右辺値は 2.1 で、それを 2 に変換するのは「=」じゃないんでしょうか?
少し表現が、微妙になりますが、
本来、タイプの異なるものは、代入出来ません。
この事は、厳しく・厳密に考える必要があります。
#数学に於いても、これは出来ません。
#但し、抽象化が行われている場合は、同じの意味が変化しています。
#演算等の処理も、そのままでは出来ません。

従って、変換自体は、代入に付随して生じたものだと思います。
#その処理は、コンパイラが自動で生成していますが。

>「等しい」より「代入」の方がしっくりくるんですけど..
>「代入」の裏は「等しい」であったとしても、「等しい」に裏はないですから。
これも表現が微妙になりますが、本来、
「等しくする為に行うのが代入」
ではないのでしょうか?
#自分の意識に注意してみると、それは理解出来ると思います。

例がプリミティブになっているので、もう少し表現を一般化してみます。

それぞれが、あるインスタンスの部分的な値とすると、「hoge = hoge + 0.1」は
a.set_hoge() = a.get_hoge() + b.get_0.1()
#0.1に付いては、もっと一般的にした方が良いと思いますが、取り敢えず。

ここで、
set_hoge()、get_hoge()
は、「hoge、0.1」が入れる箱(アドレス)になっているという意味です。
#箱だから、利用するには必ず出し入れしないと駄目。
#getは取り出す操作、setは、中に入れる操作。

>『「代入」という意味より「等しい」という意味』にはもっと深い何かがありますか?
私は、
「等しい」という概念は、思考の基本を支えている
と思っています。
数学でも、「同値律」が認識されていますが、
これは「等しい」の3つの側面を表現したものだと思います。

PCでも、「メモリテスト」で「ライトチェック」をします。
これは、「書いた値と読み出した値の相等チェック」です。
相等性が崩れると、そこにあるのは「混沌」だけだと思います。
===========================
>ALL
このスレで、あすかさんが質問されているのは、恐らく
既に正常に動いているコードの「その表現としての意味」
だと思います。
従って、代入表現に関連する難しい問題は、重要ですが、
「動作可能なドキュメント」という説明の次に来るべきものではないでしょうか?
どんなに難しい問題があっても、既に動いているソースでそう記述されているのですから。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-03-06 14:17
ところで、「動作可能なドキュメント」説はいまのところ否定されているわけですが、
その点についての反論はないのですか?

要約しておくと、

「動作可能なドキュメントとして明示」してあるのかそうでないのかは
プログラムの動作に対する読み手側の理解に依存しているため、
形式的な見え方を現在のプログラミング言語では信用することができない。
動作可能なドキュメントでありたいというのはただの願望であり、
現実的に代入式が動作可能なドキュメントなわけではない

ということなのですが。
「動作可能なドキュメントとして明示」するのが理想だね、という話なら同意。
「動作可能なドキュメントとして明示」されているね、という話なら同意できません。

# 現場の声を聞くことは諦められたのでしょうか
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-03-06 18:47
引用:

objectさんの書き込み (2007-02-27 11:10) より:
objectです。

コード:

Pattern pattern1;
Pattern pattern2;
pattern1 = pattern2 = getPattern();


の手続き的意味は、確かに
コード:

Pattern pattern1;
Pattern pattern2;
pattern2 = getPattern();
pattern1 = pattern2;


だと思います。
しかし
コード:

pattern1 = pattern2 = getPattern();


の心は、
「pattern1 = pattern2」
つまり、
「代入」という意味より「等しい」という意味であり、
そしてその値が「getPattern()」である
という事の言明になっていると考える事が大切ではないでしょうか?

C系の言語が手続き的であるのは、
CPUが持つ機能群と同型であろうとする為の手段である
と言っても良いのではないでしょうか?
#Cの「goto」も、このレベルで考える必要があるものだと私は思っています。

或る意味で、
「文」以前に「式」を考える発想は、
手続き思考を超えたもの
だと思います。
そして
「C」はそういう考え方を「ジンワリ」と深い所から教えてくれる言語である
と私は思っています。


昔、すがやみつるの『こんにちは、マイコン』で、
「どうして等しいんだ!」と憤るあらしを、
「Let a Equal To 1 で 1 に等しくする、つまり、a に 1 を入れるってことなんだ」と、さとるが説明していたんだけど(ただしN60BASIC)、またあらしの疑問に戻すんだ。



え?なにか誤解してる?
あなたが人に誤解を与えない書き方をするように努めないなら、私はあなたをゆるしませんよ!いいですね!
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-03-06 22:26
引用:

Jittaさんの書き込み (2007-03-06 18:47) より:
え?なにか誤解してる?
あなたが人に誤解を与えない書き方をするように努めないなら、私はあなたをゆるしませんよ!いいですね!


なつかしい。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?mode=viewtopic&topic=33981&forum=7&start=10
ラフィン
ぬし
会議室デビュー日: 2002/05/23
投稿数: 809
お住まい・勤務地: 外野
投稿日時: 2007-03-06 23:33
引用:

objectさんの書き込み (2007-03-06 13:20) より:

「等しい」という概念は、思考の基本を支えている
と思っています。


 それが全てとは思えないですが、確かに思考の基本ではありますね。

引用:

objectさんの書き込み (2007-03-06 13:20) より:

>「等しい」より「代入」の方がしっくりくるんですけど..
>「代入」の裏は「等しい」であったとしても、「等しい」に裏はないですから。
これも表現が微妙になりますが、本来、
「等しくする為に行うのが代入」
ではないのでしょうか?


 「等しくする為に行うのが代入」に関しては、当初より全く依存ありません。

 ただ、このスレッドのテーマが「==」だった場合は代入を意識する云々の話にはならないと思いますし、そうなるのはおかしいと思います。
 これは「表裏一体」にひっかった為に問いかけただけですが、あまり重要視していません。

引用:

objectさんの書き込み (2007-03-06 13:20) より:

少し表現が、微妙になりますが、
本来、タイプの異なるものは、代入出来ません。
この事は、厳しく・厳密に考える必要があります。
#数学に於いても、これは出来ません。
#但し、抽象化が行われている場合は、同じの意味が変化しています。
#演算等の処理も、そのままでは出来ません。

従って、変換自体は、代入に付随して生じたものだと思います。
#その処理は、コンパイラが自動で生成していますが。


 さて、問題はここででてきた「本来」と、現実には暗黙の型変換を認めている言語があるという事実と、

引用:

objectさんの書き込み (2007-03-02 12:20) より:

最初の発言の私の主旨を要約すると、
「その一文は、実行可能なドキュメント」
の意味合いが強いという事です。


との関連です。

 暗黙の型変換を行う言語仕様において「hoge = hoge +0.1」の「=」が素直に 2.1 をセットするわけではなく、エラーになるわけでなく、2.0 をセットする事実に対して「実行可能なドキュメント」としてはどうなんでしょう?

1.暗黙の型変換を許す言語仕様はけしからん
2.暗黙の型変換はわかっていることだから許容範囲
3.明確な型変換をすべき
4.これはあくまで「本来」ないしは「理想」の話

3.でいいんじゃないでしょうか?


 実は一番興味を引かれたのが、

引用:

objectさんの書き込み (2007-03-01 12:18) より:

私が、これ以上分かり易く説明しようとすると
恐らく数学的になるんだと思いますから、これ以上の説明はしません。


なんですが、何がどう数学的な説明になるのかわかりませんでした。

 スレッドの雰囲気からして書かない方が良いと思いますし、書きたくないでしょうから、気が向いたらPMで教えてください。

スキルアップ/キャリアアップ(JOB@IT)