var iro = new Array(5);
var oto = new Array(5);
iro [0] = "aka";
iro [1] = "shiro";
iro [2] = "daidai";
iro [3] = "ao";
iro [4] = "murasaki";
というような配列があって、
function play(doko) {
if (doko != iro [2]) {
oto[bunya] = -1;
alert("メッセージ1");
}
else {
alert("メッセージ2");
}
}
.......
というような関数があったとき、
oto[bunya] = -1;
alert("メッセージ1");
はどのようなことを命令しているのでしょうか。
「-1」の意味が分かりません。説明が下手です
いません。
いつもありがとうございます。よろしくお願い致します。
----
板橋国男(いたはし)
020904-4
In message news:t2xf9.535$74.5...@news1.dion.ne.jp
"kunio Itahashi" <kunit...@h2.dion.ne.jp> wrote ...
> ります。しかし、「-1」というなんだか訳の分からない数字に
> 遭遇して、何が何だか頭が混乱して分からなくなってしまい
> ました。今良い例をここに示せないのですが、
~
> oto[bunya] = -1;
> alert("メッセージ1");
> はどのようなことを命令しているのでしょうか。
> 「-1」の意味が分かりません。
はじめに分野を選択して、色付きのボタンのどこを押したかに
よってなにかを判定し、音を出す、といった感じの流れを想定
したものかとも思ったのですが、うまく全体を想像できません
でした。
おそらく事前に oto の配列をなんらかの値で初期化したうえで
for ( i=0 ; i < oto.length ; i++ ) oto[i] = i;
play() が呼び出され、この後
if (oto[bynya] < 0)
のようなかたちでなにか判断するような場面があるんじゃないで
しょうか。
ようするに、単に値を代入しているだけかと。
# 値を代入する意味はもう少し全体を見ないとなんとも言えません。
alert("message") はアラートダイアログボックスによる
メッセージの表示ですが、こちらは良いですよね?
ずっと自分のファイルとかあれこれ調べてみていま
して、遅くなってしまいました。すいません。前に例示
した配列は自分でこんな感じと考えて書きましたので、
杉田さんを混乱させてしまって申しわけありませんで
した。
改めて質問させてください。私が分からなかったのは
次の様な条件文です
if (navigator.appVersion.indexOf("MSIE") != -1)
これがブラウザの種類とバージョンによって条件分け
しているのは分かるのですが、
!= -1
というのはどういう意味なのでしょうか。
すいません。宜しくお願いいたします。
--
板橋国男
> if (navigator.appVersion.indexOf("MSIE") != -1)
> これがブラウザの種類とバージョンによって条件分け
> しているのは分かるのですが、
> != -1
> というのはどういう意味なのでしょうか。
indexOf()が何であるか分からないとね。navigator.appVersion は文
字列ですよね。ですから、
navigator.appVersion.indexOf()
は文字列のindexOf()というメソッドを呼んでいるわけです。で、この
メソッドの仕様を調べるとパラメタとして渡された文字列が元の文字列
のどの位置に現われるかを返す、もし現われないなら-1を返す、となる
わけです。だからこのif文全体は「navigator.appVersionに格納されて
いる文字列の中に"MSIE"という文字列が現われていないなら」になる。
こういうことをちゃんと読めないとプログラムが書けるようにはなら
ないでしょ? なんとなくプログラムテキストから
> これがブラウザの種類とバージョンによって条件分けしているのは分
> かるのですが、
だけではまずいというか、実は分かったとは言えないわけです。
お分かりになります? 久野
ku...@gssm.otsuka.tsukuba.ac.jp wrote in message ...
はい。なんとなく。(プログラマの道は遠い!)
で、「-1を返す」って何なのでしょうか?
「-1」は何かの約束のある数字ですか?
そこが分からないのです。
すいません。
--
板橋国男(いたはし)
kunit...@h2.dion.ne.jpさん:
> で、「-1を返す」って何なのでしょうか?「-1」は何かの約束のある
> 数字ですか?そこが分からないのです。
indexOf()は「どの位置にあてはまるか」という数値を返しますよね。
その場合、0から文字列の長さマイナス1までの数値が返るわけじゃない
ですか。で「あてはまらなかった」ということを表したい時にその目印
として何を返しますかね。
もちろん "atehamaranai" という文字列値を返したり :-) してもい
いんですが、他の場合に数値を返すんだからこういう場合も数値を返す
方が統一されていてよさげでしょ。とすると、「どこかにあてはまった」
のと混同しない値としては「-1」が素直なんじゃないですか。
なお、これは誰がどこで決めているかというと、JavaScriptの標準規
格であるECMA-262においてStringのindexOf()は「見つからなかったと
きは-1を返す」と決めているので、そこが源ということですね。
何が納得行かないのかよく分かりませんが… 久野
In article <am9195$2g...@utogw.gssm.otsuka.tsukuba.ac.jp>
ku...@gssm.otsuka.tsukuba.ac.jp writes:
> その場合、0から文字列の長さマイナス1までの数値が返るわけじゃない
> ですか。
そもそも、「0 から文字列の長さマイナス 1 まで」ってのが
ぜんぜん自然じゃありません。ってのはさておき、
> 「どこかにあてはまった」
> のと混同しない値としては「-1」が素直なんじゃないですか。
ぜんぜん素直じゃありません。
もちろん、コンピュータ的にはそれが「楽」だからそうしてる
わけですが、普通の人間の思考からすればすごく不自然な、
一種の「へ理屈」だと思います。
逆に言うと、プログラミングを上達するってのは、そういうのを
「素直」だと思うようになるってことも含むんですよね...
> 何が納得行かないのかよく分かりませんが… 久野
っていうことだと思ったんですが、外してたらごめんなさい。
ほし
> > 「どこかにあてはまった」
> > のと混同しない値としては「-1」が素直なんじゃないですか。
>
> ぜんぜん素直じゃありません。
今ほしさんがいいこと言った!
# 2ch 用語の使い方あってますか? :p
> 普通の人間の思考からすればすごく不自然な、一種の「へ理屈」だと思いま
> す。
C の EOF なんかも私は嫌いです.
# じゃあどんなのがいいのかっつーと…例外処理になるのかな?
--
Kazuo Fox Dohzono / doh...@hf.rim.or.jp
doh...@hf.rim.or.jpさん:
> # じゃあどんなのがいいのかっつーと…例外処理になるのかな?
StringのindexOf()で例外返られたらウザすぎでしょう。if文だけで
済まなくなるし。ま、「-1」は全然素直じゃないというのはそうかも知
れません。
falseならいいのか? よくわからん。 久野
「偽」のとき0、「真」はたいてい-1って言語で育ったので、
感覚的にfalse相当なのが-1なのはなんか違和感あったりします。
#というのはダメダメですか(^^;?
-+-+-+---*--+
UEHARA Shigeo :> u-og...@ma4.seikyou.ne.jp
> 「偽」のとき0、「真」はたいてい-1って言語で育ったので、
> 感覚的にfalse相当なのが-1なのはなんか違和感あったりします。
> #というのはダメダメですか(^^;?
別に感覚だから他人がダメということはないですけど、indexOf()
の場合は「先頭にあてはまった」場合にその位置として「0」が返りま
すから「偽」に「0」を使うことができませんよね。
もしかして「先頭」が「1」である言語で育ったとか :-) 久野
In message news:nnTh9.925$74.11...@news1.dion.ne.jp
"kunio Itahashi" <kunit...@h2.dion.ne.jp> wrote ...
> で、「-1を返す」って何なのでしょうか?
> 「-1」は何かの約束のある数字ですか?
「-1」単独では、そのまま数値の -1 という意味で、
特に約束というのは無いです。
「-1を返す」の方は久野さんも説明されていますが、
indexOf() メソッドの仕様でそのように決められているとい
うことで、新しく独自に作るときは、とくに -1 でなければ
ならないわけではないです。
indexOf() はある文字列中にある指定された文字列が現れる
位置を求めることが出来ますが、この位置を変数に代入した
場合は、以下のようになります。
var str = "ABCDEFG";
var idx;
idx = str.indexOf("ABC");
/* idx には 0 が代入されます */
idx = str.indexOf("CD");
/* idx には 2 が代入されます */
そして、もし指定した文字列が無い場合、idx には -1 が
代入されます。
idx = str.indexOf("HI");
/* idx には -1 が代入されます */
このように、たとえば indexOf() を使うことである値を得
られるといった場合は「値を返す」と呼んでいて、ここでは
返された値を idx へ代入しています。
悩まれた原因は条件式(ここでは!=を含む式)にあると思うのですが、
if の用法は (else 以降は省略できますが)
if ( 条件式 ) {
処理1; /* 条件式が真の場合 */
} else {
処理2; /* 条件式が偽の場合 */
}
となりますが、この条件式で得られた結果が真か偽かで
処理先が変わります。
たとえば、条件式
navigator.appVersion.indexOf("MSIE") != -1
は != を用いて、navigator.appVersion.indexOf("MSIE")
で得られた値と -1 とを「比較して等しくないならば」真
という値を得ます。
逆に「比較して等しいならば」という場合は == を使います。
これら ==, != 等(他にもありますが)は比較演算子と呼ばれ、
+ や - と同様に演算の一種で、if は条件式で得られた結果
によって判断しています。
たとえば、この得られた結果を変数に代入すると
ret = (navigator.appVersion.indexOf("MSIE") != -1);
ret には true が代入されます。
おそらく true や false と同様に -1 にも真/偽の意味が
あると考えたのかと思いますが、上記のように、条件式に
よって真か偽かを求めているということになります。
なので、もし indexOf() が文字列が見つからなかったら
-2 を返すという仕様になっていた場合は、
if (navigator.appVersion.indexOf("MSIE") != -2)
のように比較することで、もし MSIE が存在しなければ
-2 と -2 を比較して等しくなければ true となるので、
「「存在しない」でないならば」→「存在するならば」
真となります。
indexOf() でもし文字列が見つかった場合は、その返り値
は一意の値とは限らないので、見つからなかった場合の
返り値と比較していますが、もし見つかったならば、その
値は0以上となるはずなので、
if (navigator.appVersion.indexOf("MSIE") >= 0)
でも MSIE が存在するならば真となります。
あと、条件式を alert() で表示させてみるのも、理解の
補助になるかもしれません。
# なんかあまり良い説明ではない気もしますが、
# こんな感じということで。
> StringのindexOf()で例外返られたらウザすぎでしょう。if文だけで
> 済まなくなるし。ま、「-1」は全然素直じゃないというのはそうかも知
> れません。
>
> falseならいいのか? よくわからん。 久野
nil
おっと、それは CommonLisp とか Ruby ですね。
でも、僕は、これが一番自然だと思います。
# 例外として扱いたければ、数と比較して例外を発生させればよい。
--
佐々木重雄 (JavaScript のことは知りません)
In article <am9s3m$2q...@utogw.gssm.otsuka.tsukuba.ac.jp>
ku...@gssm.otsuka.tsukuba.ac.jp writes:
> falseならいいのか? よくわからん。 久野
ぼくが言いたかったことは「素直」じゃない、ということです。
久野さんの説明そのものは正しかったと思いますよ。
人間の素直な思考としては、見つからなければ見つからなかった
という「事実」を返してほしいわけです。ところが、「事実」
なんていう面倒なものは (今のところ) コンピュータには扱えない
(あるいは、扱えたとしても効率が悪い) ので、コンピュータが
得意な記号や数に置き換えてるわけですよね。
なので、-1 (にせよ、例外にせよ、false や nil にせよ) を返す
ってのは、あくまでコンピュータの都合に合わせてるのであって、
「普通の人間の思考にとっては」ぜんぜん素直じゃありません。
もちろん、コンピュータの都合にどっぷり浸かった人 (ぼく自身も
含めて) にとっては、特定の状況で特別な値を返すにあたって何を
選択すべきか、ということに関する慣習みたいなものが存在して、
それによればこの場合に -1 を返すのが「素直」だというのはよく
分かります。
けど、それはあくまでコンピュータの都合にどっぷり浸かった人に
とっての「素直」であって、そうでない人に対して何の説明もなく
「素直」と言ってしまうのはちょっと、と言いたかったんです。
ほし
> nil
> おっと、それは CommonLisp とか Ruby ですね。
> でも、僕は、これが一番自然だと思います。
JavaScript、nilがないんです :-) 久野
P.S. 「null」ならあるけど、nullでもいいと思う? :-) :-)
あとundefinedとかもあるよ。そういやNaNなんかもイイかも。
ho...@sra.co.jpさん:
> ぼくが言いたかったことは「素直」じゃない、ということです。
それは別に争いませんよ :-) 久野
> それによればこの場合に -1 を返すのが「素直」だというのはよく
> 分かります。
コンピュータにとって素直、ということですかね。
> けど、それはあくまでコンピュータの都合にどっぷり浸かった人に
> とっての「素直」であって、そうでない人に対して何の説明もなく
> 「素直」と言ってしまうのはちょっと、と言いたかったんです。
P.S. つまりさまざまな素直があるということですね。単に「素直」と
いったとき人間にとって素直という意味なのかどうかといってみ
るテスト :-) :-)
P.P.S. あくまでテストなのであしからず。
> > で、「-1を返す」って何なのでしょうか?
> > 「-1」は何かの約束のある数字ですか?
>
> 「-1」単独では、そのまま数値の -1 という意味で、
> 特に約束というのは無いです。
>
> 「-1を返す」の方は久野さんも説明されていますが、
> indexOf() メソッドの仕様でそのように決められているとい
> うことで、新しく独自に作るときは、とくに -1 でなければ
> ならないわけではないです。
みつかった場合に整数を返す必要があるなら、みつからなかった場合にそれ以
外の整数が返ってくることは、そんなに不思議ではない気がします。しかし、
それが -1 という値に決まるというのは不思議ですね。
実装として -1 が返ってくるものがあるのはよいのですが、それを判定するの
が
>> if (navigator.appVersion.indexOf("MSIE") != -1)
というのは不思議に思います。そうでなくて、
if (navigator.appVersion.indexOf("MSIE") < 0)
なら、私は何となく納得できてしまいます。
--
入内島
ですからまぁ、それがいわゆる取り決め、約束ってやつですよね。
>
> 実装として -1 が返ってくるものがあるのはよいのですが、それを判定するの
> が
>
> >> if (navigator.appVersion.indexOf("MSIE") != -1)
>
> というのは不思議に思います。そうでなくて、
これについて、Javascriptの仕様ってどうなっていたんでしたっけ?
-1 を返すという仕様であれば、全く不思議じゃ無いです。
これが上で言われている「それ以外の整数」を返すという仕様で、
実装として -1 を返すのであれば、 != -1 という比較は不思議ですね。
いやむしろ危ないコーディングというべきか。
じゃ、なんで仕様を決めた人は -1 にしたのかなってことになると、
きっとこれは -1 がコンピュータにとってちょっとだけ特別だからなんでし
ょうね。(2の補数表現で全部のビットが立つ)
この辺はコンピュータの都合と言えるかも知れない部分だと思います。
ところで、元記事の方の -1 に対する疑問って本当にこういう事なのか
なって、ちょっと疑問に思います。
単にindexOfが文字列が見つからなかった時に -1 を返すという
事を知らなくて、「何故-1なんだ?」ってただ単純にそれだけの
ような気がしますが、どうなんでしょうか。
Masaaki Ohnaka
> -1 (にせよ、例外にせよ、false や nil にせよ) を返す
この中で例外は「返す (返る)」というのとはちょっと違うと思うんですよね.
事象 (ほしさん言われるところの「事実」) が「発生」して, 「さて, その時
どうする?」ということを書く (或いは, 書かない) わけで, 間に何がしかの
“値”が介在しないというか.
-1 や false や nil や null が欲しいんじゃなくて, 事象 (事実) が知りた
いんですよね. コンピュータ的にはその為の値を用意する場合が多いんだけど,
それが要らない書き方があるならそれが自然だと思いませんか?
p.s.
NaN はとてもとても特別な値で, また違う意味合いが強いと思います.
sqrt (NaN) ≡ NaN
とか.
> じゃ、なんで仕様を決めた人は -1 にしたのかなってことになると、
> きっとこれは -1 がコンピュータにとってちょっとだけ特別だからなんでし
> ょうね。(2の補数表現で全部のビットが立つ)
> この辺はコンピュータの都合と言えるかも知れない部分だと思います。
MSB さえ立っていれば負、という実装が多くないですか? 情報量としては 1
bit で済んでしまうと思うのです。(面倒なので) ここでは 1 byte で例を書
くことにして、特別さにおいて
10000000
も
11111111
も、同じではないでしょうか。そうすると、仕様は
1???????
で充分じゃないか、と思ってしまいます。
全 bit 比較しても計算時間は得しないでしょうけど、1 bit の比較でできる
ことのために全 bit 比較するのは、気持悪くありませんか?
> ところで、元記事の方の -1 に対する疑問って本当にこういう事なのか
> なって、ちょっと疑問に思います。
はい、すみません。それはそう思います。脱線しました。
--
入内島
そもそも、一つの戻り値に二つの意味を持たせていることが、
混乱の元となっているんですかね。
二つの意味とは、処理結果と終了状態(正常/異常)ということです。
インターフェース的には、この二つを分離したほうが美しいかなと。
論点ずれていたらごめんなさい。
--
庄司
In message news:ambp5o$9k4$1...@nwall2.odn.ne.jp
"Masaaki Ohnaka" <ohn...@pop02.odn.ne.jp> wrote ...
> これについて、Javascriptの仕様ってどうなって
> いたんでしたっけ?
見つからなかった場合は -1 を返すという仕様です。
# 0-1で-1か、単に数値で返す場合-1がわかりやすい
# と思ったといったあたりだとは思いますが、
# 使う分には仕様ということで。
## 自分で作れといわれると・・・やっぱり-1かな。
はい、充分だと思います。
その場合の仕様は -1 を返すではなく、負の値を返すになります。
ここは仕様を決定する人が、どうするかだけの話だと思います。
>
> 全 bit 比較しても計算時間は得しないでしょうけど、1 bit の比較でできる
> ことのために全 bit 比較するのは、気持悪くありませんか?
ここの部分(前の部分もかな?)、私の説明に対してちょっと誤解が生じたみ
たいです。全部のビットが立つというのはあくまでも例です。
上記のように負の値を返すという仕様でも良いわけですが、そうではなく
何か一つ値を決めようとした場合、何がいいかなって話です。
そのときに -1 が採用しやすかったんじゃないかなと思うわけです。
ビットが全部立つのは見た目にもきれいですし、2の補数表現で見る限り、
表現するビット数が何ビットであろうと、とにかく全ビット立てとけば -1 なる
ということもあります。文字列が見つかった場合の戻り値が0~文字列の
長さ-1ですから、そのすぐ隣の最初の(?)負の数と言うこともあります。
また、現実にイレギュラーな時に -1 を返す仕様というのは一般的である、
ということもあります。
繰り返しになりますが、今回のindexOfの仕様を考えるなら -1 の必然性
はありません。何か特別な数を決めたいと思ったときに、-1 には選ばれ
るだけの素質を持っていると、そういうことを説明したつもりでした。
Masaaki Ohnaka
> そもそも、一つの戻り値に二つの意味を持たせていることが、
> 混乱の元となっているんですかね。
> 二つの意味とは、処理結果と終了状態(正常/異常)ということです。
> インターフェース的には、この二つを分離したほうが美しいかなと。
「異常」なら例外でしょうけど、見つからないのは異常なんでしょう
か? 見つかるかどうか分からないから調べる、という用途に使うことが
多いですよね(今回の質問もそうでした)。だったら「見つからない」の
は通常の流れであって異常じゃないから例外は使いたくない。
そうか、「見つかるかどうか調べる」メソッドと「何番目か調べる」
メソッドを別にすればいいのね。
かくしてメソッドが山のように… 久野
In article <200209200017...@muse.ocn.ne.jp>, 庄司 秀行 wrote:
>庄司です。
>
>そもそも、一つの戻り値に二つの意味を持たせていることが、
>混乱の元となっているんですかね。
>二つの意味とは、処理結果と終了状態(正常/異常)ということです。
>インターフェース的には、この二つを分離したほうが美しいかなと。
で,multiple-value-return が...
#そもそも関数が返す値の個数が1個である必然性は?
--
Hideki Kato <mailto:ka...@pop12.odn.ne.jp>
-----------== Posted via Newsfeed.Com - Uncensored Usenet News ==----------
http://www.newsfeed.com The #1 Newsgroup Service in the World!
-----= Over 100,000 Newsgroups - Unlimited Fast Downloads - 19 Servers =-----
ka...@pop12.odn.ne.jpさん:
> で,multiple-value-return が...
> #そもそも関数が返す値の個数が1個である必然性は?
別にないですけどif文なんかで使いにくいじゃないですか? たとえ
ば今回のindexOf()の場合、どういう風に書けるっていう感じに考えて
ます?
CommonLispとCLUで使ったことはある 久野
また他のみなさまも有難うございました。
--
板橋国男(いたはし)
T. Sugita wrote in message <amajn2$bte$1...@news00.iij4u.or.jp>
>すぎたです。
>[snip]
乗り遅れて、どの記事にフォローしようか迷いましたが、一応…
fj.comp.lang.javascript の <amdmga$15...@utogw.gssm.otsuka.tsukuba.ac.jp> の
記事において 2002年09月19日(木) 23時27分06秒頃、
ku...@gssm.otsuka.tsukuba.ac.jpさんは書きました。
> そうか、「見つかるかどうか調べる」メソッドと「何番目か調べる」
>メソッドを別にすればいいのね。
>
> かくしてメソッドが山のように… 久野
こーいう話題で、どーしてICONに堪能な人が現れてこないのかなー?と思って
しまいますけど。
#自分はほとんど知らないのです。
---
稲葉 浩人 in...@st.rim.or.jp
In article <amgb94$22...@utogw.gssm.otsuka.tsukuba.ac.jp>, ku...@gssm.otsuka.tsukuba.ac.jp wrote:
>久野です。
>
>ka...@pop12.odn.ne.jpさん:
>> で,multiple-value-return が...
>> #そもそも関数が返す値の個数が1個である必然性は?
>
> 別にないですけどif文なんかで使いにくいじゃないですか?
CommonLisp の multiple-value 関連の仕組みはまだまだ未完成だと(私
も)思います.上記は「一つの関数が複数の値を返す」というアイデア自体
は非常に素直なものだ(し,実装例もある)が,それ(複数の返り値)を取
り扱うスマートな方法が未開発なので...という意味(含問題提起)で書
いたものです.
>たとえ
>ば今回のindexOf()の場合、どういう風に書けるっていう感じに考えて
>ます?
つうことで,特に何も考えておりません (_ _).
#JavaScript は全然知らんし...(爆
ka...@pop12.odn.ne.jpさん:
> CommonLisp の multiple-value 関連の仕組みはまだまだ未完成だと
> (私も)思います.上記は「一つの関数が複数の値を返す」というア
> イデア自体は非常に素直なものだ(し,実装例もある)が,それ(複
> 数の返り値)を取り扱うスマートな方法が未開発なので...という
> 意味(含問題提起)で書いたものです.
それはよく分かります。言語もの好きな人が他にいれば
fj.comp.lang.miscとかでさらに続けます?
> #JavaScript は全然知らんし...(爆
このあたりの構文はJavaやC++と同じです 久野
in...@st.rim.or.jpさん:
> こーいう話題で、どーしてICONに堪能な人が現れてこないのかなー?と思って
> しまいますけど。
ICONやその前身のSNOBOLは確かに「値」と「成功/失敗」を両方扱え
ますよ。それは確かに今回のような場合にはよさそうです。さすが文字
列処理のSNOBOL。
が、例外処理はやっぱ欲しいでしょ? で、「成功/失敗」と例外と両
方入れたらさすがに屋上屋を重ねる、でしょ?
と、思いますが。 久野
> ICONやその前身のSNOBOLは確かに「値」と「成功/失敗」を両方扱え
> ますよ。それは確かに今回のような場合にはよさそうです。さすが文字
> 列処理のSNOBOL。
あ, そういうのがあったんですか. 今回私の書いた「例外」のイメージはこち
らに近いです.
> が、例外処理はやっぱ欲しいでしょ? で、「成功/失敗」と例外と両
> 方入れたらさすがに屋上屋を重ねる、でしょ?
>
> と、思いますが。
でも「indexOf () で見つからなかったというのは例外 (異常) ではない」の
ですよね? 私はそれを受けて休み中に考えていたのでした.
「成功/失敗」というかある状態で「指定されたオブジェクトとメソッドの組
では意味のある値が得られない」を示して, 例外を「意味のある値が得られる
かどうかわからない (何らかの深遠な理由により調べられない)」と考えたん
ですが….
doh...@hf.rim.or.jpさんは書きました。
> あ, そういうのがあったんですか. 今回私の書いた「例外」のイメー
> ジはこちらに近いです.
了解しました。が、プログラミング言語における「例外」という用語
は現在のJavaやC++の例外(古くはPL/Iのon文?)のようなものに使われて
いるようです。
> でも「indexOf () で見つからなかったというのは例外 (異常) では
> ない」のですよね? 私はそれを受けて休み中に考えていたのでした.
前に書きましたが、例外は制御の流れを移してしまいますから、
if(見つからなければ) ちょっと何かする
という使い方をしたい時には不向きなんですよね。SNOBOLやICONっても
ともとパターンマッチのための言語ですから、その辺はよくできていま
す。つまりパターンマッチに成功すれば文全体の実行が成功する、どこ
かでマッチしなければ文全体が失敗して、マッチしなかったところ以降
の動作は行われない(たとえば代入文なども右辺に含まれているパター
ンが失敗したら実行されない)、という形になっていました。SNOBOLは
構文が行単位(旧FORTRAN時代の言語)ですが、ICONはもっと近代的な構
文で、関数の変わりに「くりかえしあてはまり位置を返す」ジェネレー
タという機構があったかな。今の言語でいえばRubyのイテレータみたい
な感じ。こういうものも全部、値だけでなく成功/失敗の区分が返せる
ようになっていました。
> 「成功/失敗」というかある状態で「指定されたオブジェクトとメソッドの組
> では意味のある値が得られない」を示して, 例外を「意味のある値が得られる
> かどうかわからない (何らかの深遠な理由により調べられない)」と考えたん
> ですが….
分かります。ただ、I/O例外とかそういうものには普通の例外処理の
方が向いていますが、パターンマッチしなかったことの伝達には使いづ
らいでしょ?
こういう制御構造の工夫も最近は下火ですねえ 久野
In article <am9gue$dq1$1...@news2.rim.or.jp> doh...@hf.rim.or.jp (Kazuo Fox Dohzono) writes:
> C の EOF なんかも私は嫌いです.
>
> # じゃあどんなのがいいのかっつーと…例外処理になるのかな?
9999999999とか^^;
--
石川 淳 国立感染症研究所
(Jun Ishikawa) 生物活性物質部第四室
j...@nih.go.jp (旧遺伝生化学室)
Tel. 03-5285-1111 Fax 03-5285-1272
http://www.nih.go.jp/~jun/research/
ATCTCCCACATCAAGGCCTGGGCC
ho...@sra.co.jp (Hoshi Takanori) wrote:
> > 「どこかにあてはまった」
> > のと混同しない値としては「-1」が素直なんじゃないですか。
>
> ぜんぜん素直じゃありません。
>
> もちろん、コンピュータ的にはそれが「楽」だからそうしてる
> わけですが、普通の人間の思考からすればすごく不自然な、
> 一種の「へ理屈」だと思います。
>
とすると、C++のSTL的に、「見つからなかった場合は データの最終地点+1 を返す」
あたりが人間的にもコンピュータ的にも素直そうですね :)
# 行き過ぎちゃったことが通知されるだけだし
---
加藤 明(大阪大学文学部音楽学専修4年)
mail : turu...@mint.freemail.ne.jp
web : http://blue.sakura.ne.jp/~turugina/
> とすると、C++のSTL的に、「見つからなかった場合は データの最終地点+1 を返す」
> あたりが人間的にもコンピュータ的にも素直そうですね :)
indexOf() が整数ではなく「position オブジェクト」を返す仕様だとしたら?
# と, いう話が丁度先輩から来てたので.
In article <2002092513083...@news.sphere.ne.jp>
(T.T) <turu...@mbr.sphere.ne.jp> writes:
> とすると、C++のSTL的に、「見つからなかった場合は データの最終地点+1 を返す」
> あたりが人間的にもコンピュータ的にも素直そうですね :)
# C 言語的には NULL を返すのが素直です。ってのはさておき、
なんか誤解されてるような気がしますが、ぼくは別に、
「API の設計は人間的に素直なものでなければならない」
と主張しているわけではありません。
むしろ、コンピュータ的に (というか、その言語や
ライブラリがよって立つ論理において) 素直であることが
好ましいと思っています。
# JavaScript のことはよく知りませんが、C 言語には
# C 言語にとっての素直さが、Lisp には Lisp にとっての
# 素直さがあるし、きっと JavaScript にも JavaScript
# にとっての素直さがあるのでしょう。
で、あの記事で言いたかったことは、「人間的な素直さと
コンピュータ的な素直さの間にずれがある場合には、それを
ちゃんと説明しないと分かってもらえないよ。(逆に言うと、
ちゃんと説明すれば分かる筈だし、コンピュータ的なものの
考え方に慣れてもらうためにもきちんと説明する必要がある。)」
ということだったんです。
# が、案の定というか、なかなか分かってもらえないみたい...
**
それから、C++ の STL ですが、最初を指すイテレータと最後
+ 1 を指すイテレータの組み合せというのは、そういう手法が
C 言語になかったとは言わないけど、関数の引数としてはあまり
一般的ではなかったわけで、C 言語や古い C++ の伝統に対する
破壊行為だと思ってます。
# それが良いか悪いか、というのはまた別の話しですよ。
# STL には STL の論理があるし、それが C++ の新しい機能に
# マッチしていることは否定しません。
ほし
turu...@mbr.sphere.ne.jpさん:
> とすると、C++のSTL的に、「見つからなかった場合は データの最終
> 地点+1 を返す」あたりが人間的にもコンピュータ的にも素直そうで
> すね :)
これも1案ですが、最終地点が分かってないと調べるのと2度手間じゃ
ないですか。たとえば
if(s.indexOf("abc") >= s.length) ...
こうなるわけですよね。文字列ならいいのかも知れないけど、データ構
造によっては長さが即取れるとは限らなかったりしませんか。
そういや、部分文字列の位置を指定するときにマイナスの数を使って
右端からどれだけ、という指定を許すものがありますね。
ま、こういうの、結論は存在しないというか… 久野
> indexOf() が整数ではなく「position オブジェクト」を返す仕様だとしたら?
そんなら見つからない→あてはまる「位置がない」→nullを返す? 久野
j...@nih.go.jp writes:
> In article <am9gue$dq1$1...@news2.rim.or.jp> doh...@hf.rim.or.jp (Kazuo Fox Dohzono) writes:
> > C の EOF なんかも私は嫌いです.
> > # じゃあどんなのがいいのかっつーと…例外処理になるのかな?
>
> 9999999999とか^^;
2000年問題の元凶だ:-)
いっそのことプラス無限大というのは?
僕が、 nilがいい、と言ったこころは、(nil でも何でもいいけど)ボト
ム値を返して、それをまた配列のインデクスとして与えると、例外的な
値が返ってくる約束にすると、簡潔なプログラムが書きやすいよな、っ
てことでした。こんな感じ。
a[] = [0, 2, 4, 6, 8]
a.index(3) => nil
a[nil] => nil
JavaScript では、 null はオブジェクトのボトム値ではあるけど、数
値のボトム値ではないみたいなので、 null をこの用途に使うのは変だ。
一方で、 JavaScript は、浮動小数点数と整数を区別していないみたい
ですね。だったら、浮動小数点数の特別値である NaN とか +∞ でも、
さほど不自然ではないのではないかと。こんな感じ。
a[NaN] => undefined
a[Infinity] => undefined
NaN は、他の何と比較しても false になる(NaN == NaN すら成立しない)
のが、初学者のつまずきのもとではあるのですが…
--
佐々木重雄(秋田大)
> > indexOf() が整数ではなく「position オブジェクト」を返す仕様だとしたら?
>
> 見つからない→あてはまる「位置がない」→nullを返す?
…のが Java だと自然ですよね. C++ で対応するそっくりな書き方をしたいと
すると, どうするのが自然なのでしょうか.
doh...@hf.rim.or.jpさん:
> > 見つからない→あてはまる「位置がない」→nullを返す?
> …のが Java だと自然ですよね. C++ で対応するそっくりな書き方を
> したいとすると, どうするのが自然なのでしょうか.
え、C++でもオブジェクトへのポインタを返すことにすれば、代りに
nullを返すこともできるじゃないですか。
…という話じゃないのかなあ? 久野
> doh...@hf.rim.or.jpさん:
> > > 見つからない→あてはまる「位置がない」→nullを返す?
>
> > …のが Java だと自然ですよね. C++ で対応するそっくりな書き方を
> > したいとすると, どうするのが自然なのでしょうか.
>
> え、C++でもオブジェクトへのポインタを返すことにすれば、代りに
> nullを返すこともできるじゃないですか。
それでは違うプログラムになってしまうではありませんか.
# まあ string foo; の意味が全然違うので全く同じには出来ないんでしょう
# けど.
doh...@hf.rim.or.jpさん:
> それでは違うプログラムになってしまうではありませんか.
え、positionオブジェクトという新しいものを追加した場合、という
話だったと思いますが…
同じって何と同じなのかよくわからん。 久野
doh...@hf.rim.or.jp (Kazuo Fox Dohzono) wrote:
> > > indexOf() が整数ではなく「position オブジェクト」を返す仕様だとしたら?
> >
> > 見つからない→あてはまる「位置がない」→nullを返す?
>
> …のが Java だと自然ですよね. C++ で対応するそっくりな書き方をしたいと
> すると, どうするのが自然なのでしょうか.
if (s.indexOf("ABC") == position(null)) {...}
# 実装レベルまで気にしちゃダメです(逃
--
On 25 Sep 2002 05:26:52 GMT,
"久野" == kuno <ku...@gssm.otsuka.tsukuba.ac.jp> writes:
久野> 久野です。
久野> doh...@hf.rim.or.jpさん:
>> indexOf() が整数ではなく「position オブジェクト」を返す仕様だとしたら?
久野> そんなら見つからない→あてはまる「位置がない」→nullを返す? 久野
Java (Java 2 SDK 1.4 以降) ならこんなですかね?
Matcher m = Pattern.compile(pattern).matcher(input);
if (m.matches()) {
index = m.start();
} else {
// not found.
}
@see java.util.regex
Matcher が堂園さんが仰ってる「position オブジェクト」に相当するのかな?
……
indexOf() は名前からして「先頭の index を返す」のが本来の機能でしょう
から、マッチしない場合に例外を投げようが -1 を返そうが構わないと思う。
マッチするかどうかだけをテストするのに indexOf() を使うのは、間違いと
は言わないけど、意図が不明瞭になるからやめた方がいい。
だって、indexOf() を呼ぶのは index を知りたいからだし、index を知りた
いって事は「マッチする事が前提」のはずでしょ?
indexOf() が -1 を返すのが不自然なんじゃなくて、「マッチするかどうかを
テストする目的で indexOf() を呼ぶ」事が不自然なんじゃないかしら?
indexOf() があるんなら「マッチするかどうかをテストする」メソッドは簡単
に作れるんだし。
--
Java 2 SDK 1.4 では String クラスにも matches メソッドがあります。
もり <mor...@super-r.net>
> マッチするかどうかだけをテストするのに indexOf() を使うのは、間違いと
> は言わないけど、意図が不明瞭になるからやめた方がいい。
> だって、indexOf() を呼ぶのは index を知りたいからだし、index
> を知りたいって事は「マッチする事が前提」のはずでしょ?
ということはJavaScriptの場合、Stringオブジェクトのメソッドとし
てmatches()を追加するんでしょうかね。
String.prototype.maches = function(s) { return this.indexOf(s) < 0; }
結局-1であることを使っているじゃん -_-; 久野
言語使用の談義になっていますが。
ku...@gssm.otsuka.tsukuba.ac.jpさん wrote:
> ということはJavaScriptの場合、Stringオブジェクトのメソッドとし
> てmatches()を追加するんでしょうかね。
>
> String.prototype.maches = function(s) { return this.indexOf(s) < 0; }
>
> 結局-1であることを使っているじゃん -_-; 久野
あえて、-1 であることを使わないのならば、
String.prototype.matches = function( _regexp )
{
return _regexp.test( this );
}
かな?
-*-
String クラスに最初から入っている match( RegExp _regexp ) メソッドは
指定したパターンが見つかられば配列で、見つからなければ null が戻ってき
ますね。
--
赤間俊一 ak...@home.so-net.ne.jp
> indexOf() は名前からして「先頭の index を返す」のが本来の機能でしょう
ということなら, やはりマッチしない時は例外を投げるしかないと思います.
# それを曲げて「-1 を返す」ということになってるわけで.
> 同じって何と同じなのかよくわからん。
挙動ではなく意味的に同じプログラムにしたい, というかオブジェクトを返す
インターフェイスで異常値をどう考えるか, ということです.
doh...@hf.rim.or.jpさん:
> 挙動ではなく意味的に同じプログラムにしたい, というかオブジェク
> トを返すインターフェイスで異常値をどう考えるか, ということです.
その異常値は「オブジェクトがナイ」(=null)がいいのか、オブジェ
クトはちゃんと返ってそのオブジェクトを見ると「異常値なオブジェク
ト」だと分かるのがいいのか、Javaの例外みたいによそへ飛んじゃうの
がいいのか、どれでしょうね。
それ以外の選択肢はあります? 久野
> その異常値は「オブジェクトがナイ」(=null)がいいのか、オブジェ
> クトはちゃんと返ってそのオブジェクトを見ると「異常値なオブジェク
> ト」だと分かるのがいいのか、Javaの例外みたいによそへ飛んじゃうの
> がいいのか、どれでしょうね。
>
> それ以外の選択肢はあります?
呼び出し側が指定したハンドラを呼び出された側が起動する, とか.
> その異常値は「オブジェクトがナイ」(=null)がいいのか、オブジェ
> クトはちゃんと返ってそのオブジェクトを見ると「異常値なオブジェク
> ト」だと分かるのがいいのか
この辺り, 実は先輩が悩んでいるところなのでした. なんでも実験的に Java
の標準 API を C++ で実装しようとしているそうで,
String snull = Object::null;
String sempty;
String sfoo = "foo";
とやるか, 効率も考えてむしろ Java チックに
String snull;
String sempty = String::create();
String sfoo = String::create("foo");
とやるか. 後者なら
String foo = "foo";
をどうするか. これを認めちゃうとデフォルト構築を拒否しておきながら, と
いうことになるし, 認めないと
foo + "bar"
はどうするの? みたいな.
# 悩ましい….
<an0t9d$7he$1...@news2.rim.or.jp>の記事において
doh...@hf.rim.or.jpさんは書きました。
> とやるか, 効率も考えてむしろ Java チックに
:
> をどうするか. これを認めちゃうとデフォルト構築を拒否しておきながら, と
> いうことになるし, 認めないと
>
> foo + "bar"
>
> はどうするの? みたいな.
どうせ Java でもこの辺突き詰めるとインチキなんだから、「Java チッ
ク」にいくならそれに殉ずるのがすじでは?
# 私としてはやっぱり基本データ型なんてのを剥き出しでいじるのが通
# 常という事態が気持ち悪いゾと主張するわけですが。(^^;
--
成田 隆興 @ エー・アイ・ソフト株式会社ソリューシュン開発部
E-mail tak...@aisoft.co.jp
『十分間で決断し、短い理由を添えよ。』
On 26 Sep 2002 04:15:22 GMT,
"堂園" == Kazuo Fox Dohzono <doh...@hf.rim.or.jp> writes:
堂園> In article <86bs6m5...@super-r.net>
堂園> Daishi MORI <mor...@super-r.net> writes:
>> indexOf() は名前からして「先頭の index を返す」のが本来の機能でしょう
堂園> ということなら, やはりマッチしない時は例外を投げるしかないと思います.
はい。僕もそう思います。だけど…、
堂園> # それを曲げて「-1 を返す」ということになってるわけで.
この場合はそれも有りというか、まあ許容できる範囲かなと思います。
そもそも indexOf() は one shot で使う事がほとんどだし、
複数回マッチする場合を扱うのにはあまり適当でないと思う。
もちろんケースバイケースですけどね。
--
もり <mor...@super-r.net>
On 26 Sep 2002 01:47:23 GMT,
"久野" == kuno <ku...@gssm.otsuka.tsukuba.ac.jp> writes:
久野> String.prototype.maches = function(s) { return this.indexOf(s) < 0; }
久野> 結局-1であることを使っているじゃん -_-; 久野
matches の「実装」で 1 度使うだけじゃん。(^^;
下記の (A) だと indexOf() の仕様を調べないと何だかよく分からないけど、
(B) だと matches() の仕様を調べなくても素直に読める(何をやりたいのかが
容易に読みとれる)でしょ?
// (A)
if (str.indexOf(pattern) < 0) {
doSomething();
}
// (B)
if (!str.matches(pattern)) {
doSomething();
}
--
もり <mor...@super-r.net>
mor...@super-r.netさん:
> 下記の (A) だと indexOf() の仕様を調べないと何だかよく分からな
> いけど、(B) だと matches() の仕様を調べなくても素直に読める(何
> をやりたいのかが容易に読みとれる)でしょ?
いや、そう正論言われても反論はございません _o_ 久野
P.S. 面白い切り返しが思いつかなかった。
> 堂園> # それを曲げて「-1 を返す」ということになってるわけで.
>
> この場合はそれも有りというか、まあ許容できる範囲かなと思います。
「この場合」とかが出てくるのも嫌なんですけど….
# 値域が負数/整数全体の場合とか, 数値以外のオブジェクトの場合とか….