アカウント名:
パスワード:
なんでこんな気持ち悪い事ができてしまうのよw
演算子のオーバーロードがある言語でもできてしまいますが
演算子のオーバーロードの方は、まだ意識してそうならないようにみんな努力してくれるから。JavaScriptは不意打ちでバグでるからな。
意識とか努力とか。2行目は指摘と関係ないし。
とにかく嫌いなんだ、という以上のことが読み取れなかった。JavaScript でも意識してそうならないように努力すれば良いのでは。
不意打ちじゃなくておまえが知らないだけだろ
結果1・2・3なら単に比較の回数返せば良いだけだよなあ。わざわざやる奴はそうそう居ないだろうけど。
C++/C# とかでも全く同じことできますよ。
C# でも2種類書いてみた。
class changeValue{ int i = 1; public static implicit operator int(changeValue v) { return v.i++; }}
class allEqual{ public static bool operator ==(allEqual v1, int v2) { return true; }
BYTE b = 1;#define a (b++)
だめ?
変数無しの#define a 1 || 1でOK
#define a 0,3
でもOKですね
#define == |とか考えたけどさすがに無理だった
C/C++で評価順序が規定されているところはわりと少ない。
プログラム言語慣れしてるから気にならないけど、JavaScriptに限ったことじゃなく、短絡評価を採用しているプログラム言語の論理演算は気持ち悪い。とも言えると思う。
A and Bは、AとBを同時に評価して、両方がtrueならtrueである。みたいな意味のはずだけど、
プログラム言語では、Aを評価し終わってからBを評価するから、Aの評価中にBが変動しちゃう可能性もあるし、AがfalseならBを評価すらしない。
論理演算としてみると、これは気持ち悪いぞ。
短絡評価の無いプログラミング言語を使うと地獄だぜ。具体的にはプログラミング入門演習でやらされたPascal。
Pascalでの書き方はもう忘れたからCライクに書くけど、
if(a != null && a[0] == 1){ puts("a starts with 1");}
こういうので、aの値いかんに依らず、a[0] == 1が評価されて死ぬからな。
それまでちゃんと考えたことがなくて「短絡評価って高速化のためのおまけだよね」と漠然と思ってたからえらい目に会った。恐ろしさを認識できて、問題ないように書くよう意識してからも、エラーが出るわ出るわ、どんだけ短絡評価前提で書いてたんだと、びっくりした。
&&とかandって表現に違和感が、というのは分かるけど、=で代入を表現する気味悪さと同じく、そこは諦めた方が良い。
普通にこう書けばいいだけでは?
if(a != null){ if (a[0] == 1){ puts("a starts with 1"); }}
だって、こういうロジックを期待して書いてたんでしょ?
> =で代入を表現する気味悪さと同じく、
そこはPascalでは:=を使ってるところじゃん。
ていうかチラっとググったらPascalでは短絡評価を行うかどうかは処理系依存とかサラッと恐ろしいことが書かれてるんだけど。if文の条件式の中に副作用のあるものを詰め込むなという教育的指導のためにあえてそうしてるっ…てことはさすがにないよな。
VBはショートサーキットをしなかった不満が出たのかVB.NETではAndAlso/OrElseと言うショートサーキット演算子が導入されましたね、
×プログラム言語○手続き型言語
純粋関数型言語だったら短絡評価どころか遅延評価とかメモ化とかもうやりたい放題
こういう偏見は一生治らんだろうな。
この手のは、C++のtemplateでやり尽されていて、あまり好ましくないと結論出来ているかと。
#<# とか !=! とかオーバーロード専用の演算子が欲しいなぁstream にも << じゃなくて <= とかで出すようにしたほうが…
JavaScriptをはじめ、後追い言語でもジェネリックプログラミング [wikipedia.org]は大体できるようになってるので、その結論は間違ってるとしか言いようがないですね。
Rust [wikipedia.org]みたいな、2010年代の言語でもありますし。https://doc.rust-lang.org/book/second-edition/ch10-01-syntax.html [rust-lang.org]
>この手のは、C++のtemplateでやり尽されていて、あまり好ましくないと結論出来ているかと。の、「あまり好ましくない」ってのは、templateを使うと、一見かっこいい(その人の主観で)syntax sugarまがいを自作できるんだけど、好ましくないって主旨です。
>>JavaScriptをはじめ、後追い言語でもジェネリックプログラミング [wikipedia.org]は大体できるようになってるので、その結論は間違ってるとしか言いようがないですね。
だから、genericsそのものの有用性の話じゃないんですよね。人類が扱うにはtemplateが強力すぎたからgenericsに弱められたというか。その辺の歴史を勉強してみて。1999~2004ぐらいの、c++0xのtemplate使ったスマートポインタどうするの議論のころだったと思う。
C♯がわざわざテンプレート抜きで作ったのに、結局現場の要望に応えて入れざるを得なくなった、ってのが正確な歴史。こういう思想家はどこでも一定数いるけど、現実を知らない。
C#って、演算子のオーバーロードができて、ジェネリックプログラミング上等、な設計だと思ったけど。もしかして途中のバージョンで追加された機能なのかな、あれ?
ゲームなんかを作ってて、
double speed;Point p;Vector v;
みたいな感じで座標やらベクトルやらを操作しようとすると、Javaだと、
p = p.add(v.multiply(speed));
みたいにしなきゃならないところを、C#だと
p += v * speed;
で済んで、とても綺麗だったり。
何だって読み辛く書けば読み辛いコードになるってだけの話なのに、便利な道具を何でも敵視する人がいて困る。ラムダ式禁止令の話とか聞くとゾッとする。
こういうのは便利のうちに入らないんだよ
諸刃の剣とか利益相反と表現してはいかがでしょうか
そういう気持ちの悪いJavaScriptが好きで好きでしょうがないというのならともかく、こういう一般性に欠くパズルはあまり優れたものとは言い難いね
近代的なプログラム言語なら、どれでも可能。むしろJavaScript よりも簡単に書けたりする。こういうのが「気持ち悪い」と思うなら、他の言語より書き方が面倒なぶんだけ JavaScriptのほうが、まだマシなんじゃないの?
toStringいじってたら比較演算に影響が出るというのは気持ち悪いんじゃないかなあと
そもそも、doNothing()を呼んだら名前に反して破滅的な何かが起こる、みたいなプログラムを禁止する方法は無いので、その気持ち悪さは諦めるしか無い。
JavaとかC++とかみたいに、finalを付けておけばそれ以上動作を変えられることは無くて安心、という緩和策も無いことは無いけど。
JavaScriptにはObject.preventExtensions(...)、Object.seal(...)とObject.freeze(...)ってグローバル関数があって、大体finalと同じことができます。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Glob... [mozilla.org] https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Glob... [mozilla.org] https://developer.mozilla.org/en-US/docs/Web/JavaS [mozilla.org]
言語機能をどう使うかはその人(組織)次第使う側のバグは言語ではどうにもできません。
ま、既存の用語や単語を独自の意味に変えて、さらに暗黙知化や常識として取り扱うとこですね。
モデレーション警察ですモデレーションはそういう用途で使うものではありません
https://srad.jp/faq/com-mod [srad.jp]
FAQすら読まない(ry
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
私は悩みをリストアップし始めたが、そのあまりの長さにいやけがさし、何も考えないことにした。-- Robert C. Pike
この辺がJavaScriptの嫌いなところ (スコア:0, すばらしい洞察)
なんでこんな気持ち悪い事ができてしまうのよw
Re:この辺がJavaScriptの嫌いなところ (スコア:1)
演算子のオーバーロードがある言語でもできてしまいますが
Re: (スコア:0)
演算子のオーバーロードの方は、まだ意識してそうならないようにみんな努力してくれるから。
JavaScriptは不意打ちでバグでるからな。
Re: (スコア:0)
意識とか努力とか。
2行目は指摘と関係ないし。
Re: (スコア:0)
とにかく嫌いなんだ、という以上のことが読み取れなかった。
JavaScript でも意識してそうならないように努力すれば良いのでは。
Re: (スコア:0)
不意打ちじゃなくておまえが知らないだけだろ
Re: (スコア:0)
結果1・2・3なら単に比較の回数返せば良いだけだよなあ。
わざわざやる奴はそうそう居ないだろうけど。
Re:この辺がJavaScriptの嫌いなところ (スコア:1)
C++/C# とかでも全く同じことできますよ。
Re: (スコア:0)
C# でも2種類書いてみた。
class changeValue
{
int i = 1;
public static implicit operator int(changeValue v)
{
return v.i++;
}
}
class allEqual
{
public static bool operator ==(allEqual v1, int v2)
{
return true;
}
Re: (スコア:0)
BYTE b = 1;
#define a (b++)
だめ?
Re: (スコア:0)
変数無しの
#define a 1 || 1
でOK
Re:この辺がJavaScriptの嫌いなところ (スコア:1)
#define a 0,3
でもOKですね
Re: (スコア:0)
#define == |
とか考えたけどさすがに無理だった
Re: (スコア:0)
C/C++で評価順序が規定されているところはわりと少ない。
Re: (スコア:0)
Re:この辺がJavaScriptの嫌いなところ (スコア:1)
プログラム言語慣れしてるから気にならないけど、
JavaScriptに限ったことじゃなく、
短絡評価を採用しているプログラム言語の論理演算は気持ち悪い。
とも言えると思う。
A and B
は、AとBを同時に評価して、両方がtrueならtrueである。
みたいな意味のはずだけど、
プログラム言語では、
Aを評価し終わってからBを評価するから、Aの評価中にBが変動しちゃう可能性もあるし、
AがfalseならBを評価すらしない。
論理演算としてみると、これは気持ち悪いぞ。
Re:この辺がJavaScriptの嫌いなところ (スコア:1)
短絡評価の無いプログラミング言語を使うと地獄だぜ。
具体的にはプログラミング入門演習でやらされたPascal。
Pascalでの書き方はもう忘れたからCライクに書くけど、
if(a != null && a[0] == 1){
puts("a starts with 1");
}
こういうので、aの値いかんに依らず、a[0] == 1が評価されて死ぬからな。
それまでちゃんと考えたことがなくて「短絡評価って高速化のためのおまけだよね」と漠然と思ってたからえらい目に会った。
恐ろしさを認識できて、問題ないように書くよう意識してからも、エラーが出るわ出るわ、どんだけ短絡評価前提で書いてたんだと、びっくりした。
&&とかandって表現に違和感が、というのは分かるけど、=で代入を表現する気味悪さと同じく、そこは諦めた方が良い。
Re: (スコア:0)
普通にこう書けばいいだけでは?
if(a != null){
if (a[0] == 1){
puts("a starts with 1");
}
}
だって、こういうロジックを期待して書いてたんでしょ?
Re: (スコア:0)
> =で代入を表現する気味悪さと同じく、
そこはPascalでは:=を使ってるところじゃん。
ていうかチラっとググったらPascalでは短絡評価を行うかどうかは処理系依存とかサラッと恐ろしいことが書かれてるんだけど。if文の条件式の中に副作用のあるものを詰め込むなという教育的指導のためにあえてそうしてるっ…てことはさすがにないよな。
Re:この辺がJavaScriptの嫌いなところ (スコア:2)
VBはショートサーキットをしなかった
不満が出たのかVB.NETではAndAlso/OrElseと言うショートサーキット演算子が導入されましたね、
Re: (スコア:0)
×プログラム言語
○手続き型言語
純粋関数型言語だったら短絡評価どころか遅延評価とかメモ化とかもうやりたい放題
Re: (スコア:0)
こういう偏見は一生治らんだろうな。
Re: (スコア:0)
この手のは、C++のtemplateでやり尽されていて、あまり好ましくないと結論出来ているかと。
Re:この辺がJavaScriptの嫌いなところ (スコア:2)
#<# とか !=! とかオーバーロード専用の演算子が欲しいなぁ
stream にも << じゃなくて <= とかで出すようにしたほうが…
Re:この辺がJavaScriptの嫌いなところ (スコア:1)
JavaScriptをはじめ、後追い言語でもジェネリックプログラミング [wikipedia.org]は大体できるようになってるので、その結論は間違ってるとしか言いようがないですね。
Rust [wikipedia.org]みたいな、2010年代の言語でもありますし。
https://doc.rust-lang.org/book/second-edition/ch10-01-syntax.html [rust-lang.org]
Re: (スコア:0)
>この手のは、C++のtemplateでやり尽されていて、あまり好ましくないと結論出来ているかと。
の、「あまり好ましくない」ってのは、
templateを使うと、一見かっこいい(その人の主観で)syntax sugarまがいを自作できるんだけど、好ましくないって主旨です。
>>JavaScriptをはじめ、後追い言語でもジェネリックプログラミング [wikipedia.org]は大体できるようになってるので、その結論は間違ってるとしか言いようがないですね。
だから、genericsそのものの有用性の話じゃないんですよね。人類が扱うにはtemplateが強力すぎたからgenericsに弱められたというか。
その辺の歴史を勉強してみて。1999~2004ぐらいの、c++0xのtemplate使ったスマートポインタどうするの議論のころだったと思う。
Re: (スコア:0)
C♯がわざわざテンプレート抜きで作ったのに、結局現場の要望に応えて入れざるを得なくなった、ってのが正確な歴史。こういう思想家はどこでも一定数いるけど、現実を知らない。
Re: (スコア:0)
C#のジェネリックスはJavaの失敗を踏まえて少しはマシな実装になってる
Re: (スコア:0)
C#って、演算子のオーバーロードができて、ジェネリックプログラミング上等、な設計だと思ったけど。もしかして途中のバージョンで追加された機能なのかな、あれ?
ゲームなんかを作ってて、
double speed;
Point p;
Vector v;
みたいな感じで座標やらベクトルやらを操作しようとすると、Javaだと、
p = p.add(v.multiply(speed));
みたいにしなきゃならないところを、C#だと
p += v * speed;
で済んで、とても綺麗だったり。
Re:この辺がJavaScriptの嫌いなところ (スコア:1)
何だって読み辛く書けば読み辛いコードになるってだけの話なのに、便利な道具を何でも敵視する人がいて困る。
ラムダ式禁止令の話とか聞くとゾッとする。
Re: (スコア:0, すばらしい洞察)
こういうのは便利のうちに入らないんだよ
Re: (スコア:0)
諸刃の剣とか利益相反と表現してはいかがでしょうか
Re: (スコア:0)
そういう気持ちの悪いJavaScriptが好きで好きでしょうがないというのならともかく、
こういう一般性に欠くパズルはあまり優れたものとは言い難いね
Re: (スコア:0)
近代的なプログラム言語なら、どれでも可能。むしろJavaScript よりも簡単に書けたりする。
こういうのが「気持ち悪い」と思うなら、他の言語より書き方が面倒なぶんだけ JavaScriptのほうが、まだマシなんじゃないの?
Re: (スコア:0)
toStringいじってたら比較演算に影響が出るというのは気持ち悪いんじゃないかなあと
Re: (スコア:0)
そもそも、doNothing()を呼んだら名前に反して破滅的な何かが起こる、みたいなプログラムを禁止する方法は無いので、その気持ち悪さは諦めるしか無い。
JavaとかC++とかみたいに、finalを付けておけばそれ以上動作を変えられることは無くて安心、という緩和策も無いことは無いけど。
Re: (スコア:0)
JavaScriptにはObject.preventExtensions(...)、Object.seal(...)とObject.freeze(...)ってグローバル関数があって、大体finalと同じことができます。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Glob... [mozilla.org]
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Glob... [mozilla.org]
https://developer.mozilla.org/en-US/docs/Web/JavaS [mozilla.org]
Re: (スコア:0)
言語機能をどう使うかはその人(組織)次第
使う側のバグは言語ではどうにもできません。
ま、既存の用語や単語を独自の意味に変えて、さらに暗黙知化や常識として取り扱うとこですね。
とても好きです (スコア:0)
a = Object.new
b = a
c = b.dup
def a.==(x) true end
p a == 1 && a == 2 && a == 3 # => true
p b == 1 && b == 2 && b == 3 # => true
p c == 1 && c == 2 && c == 3 # => false
# 理に適いすぎていて惚れる
Re: (スコア:0)
モデレーション警察です
モデレーションはそういう用途で使うものではありません
https://srad.jp/faq/com-mod [srad.jp]
FAQすら読まない(ry