JavaScript の質問用スレッド vol.123 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
JavaScript を自ら学ぶ人のための質問スレッドです。 >>2-6 のテンプレを読んだ上で質問してください。次スレは>>950 が>>2 のテンプレ案(本スレで改善案があれば考慮)を元に立ててください ■質問を書く上で (1) 煽り、コード制作依頼等、人を不快にさせる投稿はご遠慮下さい。公序良俗を守った応対を心がけてください。 (2) 他の人に迷惑をかけるスクリプトの質問はご遠慮ください。 (ブラクラ、[戻る], [閉じる], [クリック] の妨害、画面占有など) (3) 質問者及び議論を行う人はメール欄を空欄にし、名前にレス番を入れることを強く推奨します。回答者はなりすましを判断できませんので、なりすましが現れても自己責任となります。 (4) 常に自発的に調べる心構えを持ってください。 具体的には「自分で調べてから質問する」「回答をもらってわからない単語があればGoogle検索してみる」など。 わからない内容を代わりに調べてくれる回答者をお望みの方は余所で質問してください。 (5) 出来るだけ一般的な用語を使用してください。脳内オレオレ用語は混乱の元です。 (6) 出来るだけサンプルコードを掲示してください。言葉による説明は行き違いが生まれる場合があります。 ※必ず「問題の事象が再現されること」を確認してください。 必要な部分だけ切り出したつもりで現象が再現できていなかったケアレスミスがしばしば見られます。 (7) サンプルコードに HTML が含まれる場合は http://validator.w3.org/ で [Check] してみてください。 (8) 質問を具体的かつ詳細に書くと回答を得られやすいです。>>2 の質問テンプレートを活用してみてください。 (9) ライブラリ関連の質問は禁止です。関連スレにあるライブラリ質問スレで質問して下さい。 (10) 時にはあなたが望む「答え」だけでなく、「意見」などが寄せられる場合もあります。 ※前スレ JavaScript の質問用スレッド vol.122 http://echo.2ch.net/test/read.cgi/tech/1472426483/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured つか、何度も言っているが、 俺が間違っているというのなら、お前らが説明してやれよ。 マジでお前らヤクザのやり方を地で行ってるぞ。 仕様書の該当部分は既に明示されているし、 そこにはそう書いてある(と俺には読める) これ以上俺が出来ることはないんだよ。 お前らって、内容を読まずに批判する為の批判を繰り返すよね。 そして相手が悪いという事に無理矢理持っていこうとする。 これはゆとりに多いパターンだけど。 イデオロギーと主張と日本語が読めないと言うのは互いに疎だろうから、ちょっとこうなると話が終わらなくなるな。 >>95 正当か正当でないかは主観だから言い換えるとして「正当かもしれない批判を全部人種差別にすり替える」を技を >>95 という批難のレスが自己言及を起こしてるから、根拠を足すか別の表現で説明して。 批判のための批判ではなくて、論理的に正しい批判が読みたいな、俺は。 ヤクザ、ゆとり、韓国人、これらはすべて論理的な議論において無用なレッテル貼りでありこれまた詭弁の典型例である 発言者が馬鹿だと論旨の正否に関わらず批判を受けるという好例だわ >>80 は真っ当なものだし、正しいと俺は思う 根拠(URL)も十分に出てるし、補足することは何もない 対して彼の返答は「そうとしか読めない」しかなく、具体的なところは何もない 信じてもらえなくて当然だと思う >>96 少なくとも彼は>>80 や>>87 で自分の正当性を説明出来ているけどね 君はなぜか完全スルーの構えでそこに触れてないが 仕様は変わらないのだから、仕様の解釈を説明するしかないのに、それが出来ないのは君に説明能力がないとしか思えない あと、君の発言は段々、暴論になってきているから気を付けた方がいい 人格否定や差別的発言は明らかに君が間違ってる(君の論にてらせば、君が悪い) いっちゃ悪いが、自分の発言が認められなくてだだをこねている子供のようだ というかこの手の「ゆとりスクラム」、最近割と良く遭遇するようになったが、何がしたいんだ? 俺に説明能力がないというのなら、俺に説明を求めること自体がおかしいし、 説明能力があるゆとり君が代わって説明すればいいだけ。 俺が文章を読めてないというのなら、俺にそれを文章で説明しろというのは無理な話。 俺を信じれないというのなら、ああそうですかでしかない。そもそもそういう話ではないし。 ゆとりって基本的に他人に文句は言うけど、自分で改善しようとは全くしないよね。 今の現実世界はそれまでの大人達が少しずつ改善を重ねてきた結果だというのに。 俺は2chしかほぼ見てないから > 実際、某Q&Aサイトでも名前を何度も変えては同じような質問を繰り返して、 > 詳しい回答を貰うと「初心者なので分からないです」と返信する人がいるよ (>>76 ) には遭遇したことがないけど、(というより遭遇しても気づくほど見てない) この手の「無理矢理○○って事にしたい」ってのは最近すごく遭遇するんだが。 わかったから他所でやってや ゆとりでもそうでなくてもどうでもいいが、スレタイぐらいは読めるやろ >>106 破綻しとる。 自説を説明する能力がある人間でも、代わって「おまえの理論」の説明はできまい。 説明能力が無いなら説明を求めるのがおかしいって無茶苦茶じゃん。 説明能力がある奴に、説明を求めるのは無意味だろ。 だって説明能力があるならば、求めるより前に説明してるはずじゃん。 説明能力か無いからこそ、説明しろと要求されていると思えよ。 論理的にやろう。ゆとりも、非ゆとりもな。 > 俺に説明能力がないというのなら、俺に説明を求めること自体がおかしいし、 書いてあんだろ? 「俺に説明能力がない」だ 説明が足りないじゃない。 説明する能力がないのだ。 感情を表現する能力がないやつに 感情を表現しろと言っても無理だろ? 計算する能力がないやつに計算しろと言っても無理だろ? 説明する能力がないやつに説明しろって言っても無理だろ? 要するに「無能」が正しいと認めているわけだから、 「無能」に聞いても、能力がないやつには答えられないということ >>112 違う違う。 無能だからこそ、説明を求められるんだ、と。 能力が無いならば、最初から説明しようとすらするはずが無いんだよ。 全くできない事をしようとする事はあり得ないんだし。 空が飛べないのに空を飛んで見せるのが、全くできない事をするって言うことだよ。 相手の言葉をうまく摘んで「無い」の定義を適当に用意してはいかん。ただの逃避だよ。 それこそ自分が揶揄してるやつ。 吐いた唾は飲もう。 自らの正当性を主張する人が自己完結していないわけがなので、ID:nVVEnA7X0も俺も自己完結している点では同じ 見解の相違で衝突した場合、お互いに根拠を出しながら意見を出すのが普通 相手の論理を崩すには「相手が出した根拠が間違っている証拠」をだしたり、「根拠の解釈が間違っている論理的矛盾」をだしたり、と論理的に話をする ところが、ID:nVVEnA7X0 は「いや多分あの書き方だと(>>75 )」「そうとしか取れない(>>88 )」と恣意的な感想を述べるばかりで根拠も論理展開も何もなければ、相手の論理的矛盾に言及するわけでもない 根拠や意見を掲示するのは>>80 だけ 説明出来ないというが、「そうとしか取れない」理由を具体化すれば説明可能なはず 具体的な何をすれば良いかは>>84 で補足要求してくれているのに無反応 この状況で説明能力がないといわれるのは仕方がないし、何も反論出来ないのなら説明能力がないと認めているも同義だと思うがね 人間なんてみんな無能だよ 協力し合わないとなにも為せないんだよ そのことを忘れちゃだめ とりあえずスレ違いだからツイッターあたりでバトってもらっていいかな? window.fetchでshift-jisのデータをダウンロードしてresponse.text()で文字列にすると文字化けしてしまうのですがどのようにすれば文字化けしないようにできますか? >>121 外部サーバーなので出来ないです(´;ω;`) メッセージングの手段とかないの? まあ例えばC#アプリとやり取りするときとか、最も汎用的な方法はローカルWebSocketだよ 2chも、shift-jisだから、JSで扱えない でも、YQL(Yahoo Query Language)を通して取得したら、UTF-8になってる。 文字コードを推測して、変換しているのかね? この板よりも、web制作管理板で質問した方がよいかも。 そっちの方が、人が多いから > 2chも、shift-jisだから、JSで扱えない そんなわけねーだろw 文字コードを変換すればいいだけ もしくは適切にパラメータ与えれば ブラウザが勝手にやってくれる iframe に読み込ませれば、ブラウザが自動変換するから、文字化けしないけど、 自分で、JSで、2chのHTMLを取得しようとすると、shift-jis のままじゃないの? つまり、ブラウザを通せば、変換されるけど Fetch APIにはContent-Typeを上書きする機構はないのかな >>122 外部サーバならクロスドメインを許可してる事になるという事? それなら、そのサーバ管理者に相談してみては? http://echo.2ch.net/test/read.cgi/hp/1456242505/392 「移動を勧められたので、移動しました」と言い訳しそうだが、質問をクローズせずに並行質問する行為はマルチポストという 人が多いとノイズも多くなるので、俺はWeb制作板をお勧めしないな new Headers で XMLHttpRequest#overrideMimeType 相当の機能が実装できそうだが https://sbfl.net/blog/2017/01/29/fetch-api/#i-3 >>130 リクエスト時のヘッダーにコンテンツタイプを指定するってことですよね?やったんですが出来ませんでした。 fetchにはオーバーライドマイムヘッダーはないというとこですか? 文字コードを変換することは出来ませんか? 実行環境はelectronのrenderer processです 出来ればnode.js特有のモジュールを使わない方法がいいですが... setTimeoutとseIntervalって使い分けってどうやるんやるんですか? なんか参考にするコード教えてください そのまんま、一定間隔で実行を繰り返したいか一回だけ呼びたいかの違い >>132 2chは、文字コードを指定していないから、やっかい。 JSでは、UTF-8 と扱われて文字化けする 結局、jQueryから、YQL (Yahoo! Query Language)のサービスを使って、 2chのHTMLを取得できた。 YQLで、shift-jis からUTF-8へ、文字コードを自動変換しているのかな? jQuery → YQL → 2ch VBScriptについて必死に話し合うスレ http://echo.2ch.net/test/read.cgi/tech/1416826139/924 >>134 一定周期動作をさせるなら、処理完了後からIntervalを取るか、処理開始時からIntervalを取るか 例外でタイマーを止めるか、一定周期で例外を出力し続けても止めないか 「settimeout setinterval 違い」で検索! HTMLのテキストボックスへ日本語を入力中に、 強制的に確定(Enterを押した場合と同じこと) もしくは入力をキャンセルさせる(ESCを2回押したような処理)ことは可能ですか? それができるなら、利用者の性癖を盗みとる事ができそうだな カンマ演算子を積極的に使っているコードを知らないか? この際、他言語でも構わない。 三項演算子を使って宣言的(という言い方が正しいかは微妙だが)に記述すると、 var somevalue = (caseA)? valueA : (caseB)? valueB : valueC; という形になってくるのだけど、 この際単純な式だけでは無理な時があって、カンマ演算子を使いたくなってくる。 とはいえCの世界ではほぼ完全に禁止に近くて、推奨とか積極使用とかは聞いたことがない。 おそらく何らかの問題をはらんでいるからだと思う。 元々Cは手続き的だし、限界までチューニングするので、相性も悪い。 そこで、わりと好き勝手やっているJavaScriptの世界なら誰かしら使っているかもしれんし、 ソースも見えて助かるので、どこか積極使用しているところとか知らないか? 推測だが、他の「宣言型」と言われる言語も 本当に宣言的に記述するのなら大量使用しているはず。 ソースが公開されていて、何をやっているか分かり、 相手の技量も分かる状況なら他言語でも構わないのでよろしく。 さらっと調べてはみたんだが、 そもそも使ってない言語の検索では要領を得ず、いいのが出てこない。 Scala使っているやつ居たよな?そっちではどうとか、あればよろしく。 >>142 google closure compilerが割と積極的に,使ってくるよ。 問題と言えば、代入だったら実際に代入される値から遠いとか、そもそも分けて書けよとか、アトミックである保証がある場合とない場合があるとか、色々ある。 つかClosureCompiler遣い居たのか。 それってコンパイル後のコードって読まないでしょ? (なんで君が読んでいるのかは知らんが。 さすがにミニファイは読めないから信じるしかなくて、 通常ClosureCompilerもそれに近い扱いだと(勝手に)思っているが) おそらく問題は「可読性」だけなんだと思っている。 だからコンパイラやトランスパイラが使うのは全く問題なくて、 逆に言えば、使うメリットがあるからコンパイラが使っているとも言える。 可読性の問題はおそらく「色々な書き方が出来ること」「読む方が不慣れなこと」に尽きる。 だから「コンマ演算子が多用されている『世界』」があれば、 彼等はなんとかしているのだとも思っている。だからそれを確認したい。 googleのコーディングルールでは、 C++もJavaScriptもカンマ演算子を明確には禁止にしていない。多分グレーゾーンだ。 > アトミックである保証がある場合とない場合があるとか カンマ演算子でアトミックに出来るか? というかいわゆるマルチスレッド環境で言う「アトミック」はJavaScriptにはないはずだが、 それ以前にシングルスレッドだからアトミックとか要らんわけだが。 カンマ演算子みたいな副作用前提のものを宣言型プログラミングで積極的に使うなんてことあるかぁ? ただ一文になってるってだけじゃん 普通は関数化して処理部分は関数内に隠蔽するでしょ いやその関数を2回呼びたくない時にどうするかだよ。 副作用無しの関数なら、先に呼んでしまって一時変数化するというのが通常の解法。 でも最初の分枝、142の例で言うとcaseAに当たった場合にこれは不要なら、 関数呼ぶだけ無駄でしょ。 関数に副作用がある場合は一時変数化も出来なくて、 if文でしこしこ書くことになる。 とはいえ関数型の場合は副作用無しにして何度でも呼んでしまえ、が正義なのかもね。 なお俺が使おうとしている状況は、、、と詳細に説明しようとしたが、 JavaScriptの場合は型無しなので、 || と && 上手く使ったら カンマ演算子無しで書けそうな気もしてきたorz ?? 関数を2回呼ぶとか一時変数にしないといけないってのがよくわからん 必要ないと思うけど…まぁ本人が自己解決できそうならいいか どの言語でもそうだけど、 コロンで区切れば、独立した文だから、安全 カンマでは、独立した文にならないから、 副作用・評価順序などを勘違いしやすく、バグが多くなる。 だから、カンマは使わない方がよい 短絡評価も、後ろの式が実行されるかどうか、分かりにくいので、 使わない方がよいと言われる とりあえず、文と式の区別がつくようになってから出直しなさい プログラマーたるもの言語仕様に依存せず、型を強く意識し型に対してプログラミングしましょう >>147 あ、いや、やっぱ多分無理だ。こんな感じ。 (カンマ演算子は使ったこと無いから文法が怪しいが、多分これであってると思う) var result = (sel==='ALL')? query_set(name, 'ALL') : (var tgts = get_tgts(name), (tgts)? query_set(name, tgts) : obj[name]); sel==='ALL'の時にはquery_setを呼び出す。 それ以外の時にはget_tgtsでリストを確認し、該当した場合はquery_setを呼び出す。 該当無しの場合は単にobjを名前で引く。 query_setは何度呼んでもいいが、 初めて呼ぶ場合には obj[name] に色々初期化した物を作成して登録する。 登録されている物はobj[name]で確認出来るし、 2回目以降(既にobj[name]が存在した場合)にはobj[name]が返される。 だから上記は、 sel==='ALL'の時は常にobj[name]を引き、無ければ登録してそれを返す、 それ以外の場合は、新規登録リストget_tgtsにあれば新規登録してそれを返す、 なければ既に登録されていればそれを返す、となる。 ここで get_tgtsは何度呼んでもいいから上記は var result = (sel==='ALL')? query_set(name, 'ALL') : (get_tgts(name))? query_set(name, get_tgts(name)) : obj[name]; とすることも可能だが、 get_tgts(name)は重くなる可能性があるので 必要な時にのみ一度引くようにしたい。 逆に obj[name]は1回引いて終わりだし、こちらも何度引いてもいいので、 var result = (sel==='ALL')? query_set(name, 'ALL') : (obj[name])? obj[name] : (var tgts = get_tgts(name), (tgts)? query_set(name, tgts) : null); とも出来る。 これだと、fが1回呼ばれるのか、2回か、どちらか分からない 1 < f() && f() < 10 こう書けば、1回しか呼ばれない a = f(); 1 < a && a < 10 Pythonでは、こう書けるから、1回しか呼ばれない 1 < f() < 10 fがオブジェクト・関数などの場合、どういう副作用があるか分からない。 何かのリソースにアクセスして、その電荷を変えてしまうかもしれない volatile というけど、読み取っただけでも、電荷が逆転するデバイスがあるから、 2回読み取ったら、正常に動かないとか 諦めてif文でしこしこ書いてもいいのだが、tgtsなんて結局ここでしか使ってないし、 欲しいのはresultだけだから var result = の書き方で出来た方が見やすい。 ただ、関数型ならここをそのまま切り出して、 function somefunc(name){ ここはif文でしこしこ return result; } で上位からは var result = somefunc(name); で隠蔽してよしとするのかな? 多分ここが噛み合ってないのだと思う。 >>144 いや、カンマ演算子全体に対して言ったんだよ。 読む側が不慣れとかじゃなくて、どれくらいのメリットあるの? メリットがあってもデメリットを下回れば、そりゃ無駄なんだし。 >>154 ちょっと輻輳気味だが、 >>151 内、 1. get_tgts(name)はユーザー作成リストを参照するので際限なく重くなる可能性があり、 可能であれば出来るだけ引きたくない。 2. ちなみに今はこの手の「重くなるかもしれないユーザー作成リスト」についてはキャッシュを作成し、 それを引いているから実は重くないのだが、キャッシュの管理が面倒なのも事実。 3. だから「重いけど我慢出来る範囲」ならキャッシュ無しで組むのもありか?とも思ったり。 その時に出来るだけ無駄のない動作をする為の記述が必要であり、それが今回。 つっても同様のケースは以前からあり、 カンマ演算子を三項演算子内で使用することについては、考えてはいたんだが。 実際、result を得る為だけに使う tgts とかは result = 式内に閉じこめた方が見やすいでしょ。 そして記述通りに動くのならそれが最速の記述ではあるし。 見やすくて速いんだからやらない理由はない。 ただしカンマ演算子については積極的に使っているのを見たことがないから、 多分何かしらかなり問題があって、、、だろうからそれを先に確認したくてね。 >>151 こんな感じでどうでしょ var result = sell ==='ALL' ? query_set(name,'ALL') : ((tgts,name,obj) => tgts ? query_set(name,tgts) : obj )(get_tgts(name), name, obj[name]); >>148 > 短絡評価も、後ろの式が実行されるかどうか、分かりにくいので、 > 使わない方がよいと言われる いやそれはCの世界では嘘だ。あっちは短絡評価ありきで組む。 そして俺はもちろんJavaScriptもそうしているし、 逆にwhile文とかは短絡評価無しだと組みにくいでしょ。 典型的パターンは以下。 var i = start; while (i<arr.length && arr[i].prop!=xxx) i++; 関数型?で無理矢理組めば、 var i = arr.slice(start).findIndex(function(v){return v.prop==xxx;})+start; なのか?しかし無駄が多いし余計に見にくいだろ。 >>156 それが > 普通は関数化して処理部分は関数内に隠蔽するでしょ (>>145 ) なのか? その書き方ではカンマ演算子を使わなくて済んでいる。 引数を一時変数に使うことにより回避している。 これは事実だが、余計に見にくくないか?(多分if文使って書いた方がマシ) また、それって一般的か?俺はあんまり見ないが。 (もっとも、俺は配信されているもの、 つまりコンパイル後のコードしか見てないから、ES3準拠?とかの可能性はあり、 コンパイル以前のコードについては知らないんだが) 「配列arrの中の、start番目以降の要素の中で、prop==xxxに当てはまる最初の要素のインデックス」を 求めるならこんな感じにそのまま書けばいいのよ var i = arr.findIndex((v, idx) idx>=start && v.prop==xxx); >>159 ああそれはその通りだね。 (俺はあの書き方はそもそもしないから慣れてない) ただ俺はそれだとstart以前も走査するのが気に入らないから、 やっぱりwhileで回すけど。 >>157 var i = arr.slice(start).findIndex(function(v){return v.prop==xxx;})+start; 最近の書き方だとこうだろ? var i = arr.slice(start).findIndex(v => v.prop == xxx)+start; んで、lodash使えばこうなる。 var i = _.findIndex(arr, {prop: xxx}, start); >>157 >>160 > なのか?しかし無駄が多いし余計に見にくいだろ。 > (俺はあの書き方はそもそもしないから慣れてない) コードの話をしようぜ? 俺は見にくいというのは、コードの話じゃなくて お前の話になってる。 お前が見にくいっていうのなら、単にお前が未熟ってだけ。 コードの話をしている時に、人の話をしてはいけない >>159 こうだな var i = arr.findIndex((v, idx) => idx >= start && v.prop == xxx); var i = start; while (i<arr.length && arr[i].prop != xxx) i++; var i = _.findIndex(arr, {prop: xxx}, start); 一行につなげて比較してみよう カンマ演算子の使いどころは、一つのStatementしか記述を許されてない箇所にある (while文の条件式、アロー関数の省略記法、三項演算子など) 省略記法が大好きな人ほど好む傾向があるかも知れない >>158 いやまぁもちろんこんな無名関数をそのまま書いたりしないけどね 上と抽象度違っちゃってるし、いつもはちゃんと名付けするよ(面倒だから手抜きしましたごめんなさい) 「一般的か?」って言われたら、JavaScriptでは一般的ではないでしょう だいたいみんなif文使うし、宣言型なんて見ない見ない ただまぁこうやって引数にしちゃえばキャッシュ出来るよという参考までに あとは自分で選べばいいさ >>161 sliceした方がいいかどうかは場合によるのだけど、 一般的にはsliceせずに回す>>159 だと思うぞ。 それはおいといて、そもそも findIndexに開始地点を指示出来ないのが謎なんだが。 だからlodashが必要になるわけで。 とはいえlodashは普及しないよ。 確かに短く書けるけど直感的ではないし、わざわざ学ぶほどの価値もない。 とにかくその件については俺はwhileの一択だ。 速いし分かりやすいし。 君がそう思わないのも君の自由。 ただいずれにしても、おれはカンマ演算子について聞きたいのであって、 157以降は俺の興味以外だから降りるよ。 >>165 > JavaScriptでは一般的ではないでしょう ちなみにこれを他言語では一般的にやってるのか?それは何言語? 別に糾弾しようってわけではなくて、ちょっと見てみたい。 ちなみに抽象度については俺も思ったが、それ以前に、 1つのことをやる物を2つに分解して配置したくないので、 俺は「名前付き関数」にして呼ぶって事もしない。if文で書く。 ただしこれはCでは関数内関数が使えないからそういう文化なのであって、 関数内関数が使える言語なら別文化もありだとは思う。 >>157 もちろん、それでいいと思うよ そこら辺考えだすとそうするしかない 折衷案としてはこんな感じでwhileの部分を関数化する感じかな var searchPropIdx = function(arr, tgt, start){ var j=0, len=arr.length; while (j<len && arr[j].prop!=tgt) j++; return j; }; var i = searchPropIdx(arr,xxx,start); これでも何してるかは関数名が教えてくれるから宣言的といえるのではないでしょうか >>166 > 分かりやすいし だからコードの話をしている時に 自分の話をするなって >>168 自分で関数作るぐらいならlodashの方がいいな。 いきなりsearchPropIdxとか書かれても コード読まないと何をしているのかわからない。 lodashのような有名ライブラリであれば 有名なライブラリを知っているならば使い方わかるし たとえ知らなくても、誰かが解説してくれてれる >>170 lodashが使える環境ならもちろん使う ただまぁ標準ライブラリではないから今回のケースでは考えませんでした >>168 まあ、俺も必要な場合はそのように関数化してくくり出すけどね。 メリットは抽象度が上げられて依存関係を切れる(隠蔽出来る)ことだが、 ここら辺は要するにオブジェクト指向のメリットであり、 そもそもオブジェクト指向は巨大なコードを何とかする手法だから、 ここでlodashを布教している奴が理解することはないというのは、 これまでさんざん見てきたとおり。 俺はlodashが使える環境でも使わないね。whileで書く。 ただここら辺は各人が好きなようにすればいいだけの話だね。 >>172 自分のやり方を押し付けるな 俺はコードの話をしてるだけ >>167 「値は引数を関数に適用させて作るもの」ってのはラムダ計算の基本的な考え方だから、大抵の関数型言語ならそうじゃない? そもそも例えばHaskellなんかは今回でいうget_tagを同一スコープ内で何回実行したところで、 引数が同じなら計算結果は最初のものを常に使い回すしね 別に好きに書けばいいんだよ ただ最初に宣言的って言ってたのが何か勘違いしてそうで引っかかっただけで >>174 > ただ最初に宣言的って言ってたのが何か勘違いしてそうで引っかかっただけで これについてはそちらの指摘通り、俺は勘違いしていると思う。 俺は関数型言語を使ってはいないからね。 これは、俺の用語に誤用がある可能性を考慮しつつ話をしてもらうしかない。 > そもそも例えばHaskellなんかは今回でいうget_tagを同一スコープ内で何回実行したところで、 > 引数が同じなら計算結果は最初のものを常に使い回すしね Haskellってインミュータブルだったっけ?忘れたけど、 確かにインミュータブルだったらこれで終わりだね。 つべこべ言わずに何回も書いても関係ない事になる。 しかもHaskellの場合は遅延評価だから事前に書いても大してオーバーヘッドもない。 まあこの辺が便利なのかもね。 > 大抵の関数型言語ならそうじゃない? そうか。了解した。 すまん、 × インミュータブル ○ 再代入禁止 だね。 >>157 >> 短絡評価も、後ろの式が実行されるかどうか、分かりにくいので、 >> 使わない方がよいと言われる > いやそれはCの世界では嘘だ。あっちは短絡評価ありきで組む 後ろの式に、副作用がある場合、バグ含みになるから、危険。 それで、Pythonでは、以下のように書けるようになってる 1 < f() < 10 MISRA-C 2004 のコーディング規則を参照 <tr> <td><%= name %></td> <td><%= gender %></td> <td><%= job %></td> </tr> lodash.js (underscore.js)には、template があるから、 jQueryですべての要素を作らなくても、HTMLファイルに値を埋め込むだけでよい >>177 つかMISRAを持ち出すのなら番号まで指定してくれ。 あれは膨大な数があるんだから。 つっても、見てもそうだとしか書いてないとは思うが。 > 1 < f() < 10 Pythonがそう書けるのはいいとは思うが、そもそもCプログラマで > 1 < f() && f() < 10 をやる奴はいないんだよ。これは常識だから。 次に、関数型が「参照透過(キリッ」とかやっているのも Cだと最初からほぼ参照透過なんだよ。 クロージャはないし、グローバルもほぼ使わないんだから。 (通常はポインタを与えないと非参照透過にならない。 ポインタについては明示的に見えるから、 クロージャのある言語のように「参照透過」を気にする必要がない) だからそこら辺の文化は明らかに違う。 実際、whileループなんて短絡評価ありきでないと組めないし、 俺が出した例なんてマジで頻出だぞ。 で、それを「俺は配列の長さなんて管理したくない。 該当するインデックスが欲しいだけだ」と言うのなら、 コード例も既に出したように、それが明示的には見えないコードにすればいいだけだろ。 ただ俺はあれで効率が上がるとは思えないがね。 根本的に違うのは、 while (i<arr.length && arr[i].prop != xxx) i++; はCに於いてはarrに対して副作用を持ち得ないんだよ。(通常はvolatileでないから) ところがJavaScriptではゲッタやプロキシがあるし常用されるから、これだけでは言い切れない。 だからそもそも「副作用」に対する感覚が全然違うんだよ。 MISRA-C 2004 ルール12.4 論理演算子 && または || の右側のオペランドには、副作用があってはならない。 volatile もダメ >>181 それは × 短絡評価が駄目 ○ 短絡評価内で副作用が駄目 だよ。重ねていうが、以下認識は間違いだ。 > 短絡評価も、後ろの式が実行されるかどうか、分かりにくいので、 > 使わない方がよいと言われる (>>148 ) 結局の所、12.4も「短絡評価されるから」という大前提でしょ。 Cの世界はそうだよ。 短絡評価自体が駄目なんてのは、聞いたことがない。 というか今更気づいたが、カンマ演算子ってほとんどの言語ではないんだな。 むしろある方が異端のようだ。 ある:C/C++, JavaScript, Perl ない:Java(ただしfor文内のみ可), C#, Ruby, てか多分他全部 JavaScriptの場合は匿名関数をその場で定義して使っても構わないから、 文が書けないからカンマ演算子という時は大抵この方法でも回避出来る。 といっても余計に見にくくなるが。 例: (function(){ /*何かの動作*/ })() 普通にif-elseifで書けばいいのに、カンマ演算子にこだわりすぎて暴走しとるな 構文なんだから人間様解るように記述すればいいだけ ただのオナニー 関数型風に書けよw カンマ演算子なんて関数型風でも 一旦変数に入れるだけの話だろ そもそも関数型風のメリットは論理と計算の分離であって、どっちがいいとかじゃないし 三項演算子を使ってcaseAの場合aが返ってくるなら、そうでない場合は同等の型のbが返ってくるのが基本 三項演算子をネストさせるってことはそもそも論理と計算が分離されてない それを気にしないなら別に好きにすればいいんだよ 見やすい見にくいみたいな主観に任せればいい 関数型風にすればconstを使えるようになる。 変数に入れた値が変わらないから、コードを把握しやすくなるし バグも減るのがメリット 全部プロトタイプベースで書けばいいと言うのと同じくらい無意味な綺麗事 つうかconstは長いし普通の人にとっては読みにくい 意地っ張りの価値観の押しつけをする気が無いのなら 手元では好きに書いていいが挙げるときは置換くらいしてくれ それが最低限のマナー > つうかconstは長いし普通の人にとっては読みにくい 英語読めない人? 新しいものが一般的でないのなんて当たり前なんだよなぁ いかにそこから普及させれるかだ 先人の叡智を無駄にしてはいけない > つうかconstは長いし普通の人にとっては読みにくい constが長かったらdocument.body.innerHTMLとかもはや解読不能だろ むしろconstは多用したほうが保守性は上がるでしょ。今時var宣言使っちゃだめよ constでキレイにインデントできたら最高なんだけどなぁ 仮にconstが消えてもletになるだけで varにはならん 全部constにするんなら、宣言要らない関数型altJS使えばいいじゃん ES6なら末尾呼び出し最適化が働くのでforは再帰で書ける なのてletは不用 constだけで良い インデントも揃う >>198 いやいや、フルconstの自由があるならAltJSくらい余裕でしょ つうかconstの実際価値があるっていうのじゃなくて 単にconst、constって書いて自己満足、安心「感」を得たいだけになってるでしょ ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる