「演算子」を含む日記 RSS

はてなキーワード: 演算子とは

2008-06-10

諸君、私はC++が好きだ

諸君、私はC++が好きだ

諸君、私はC++が好きだ

諸君、私はC++が大好きだ

演算子オーバーロードが好きだ

テンプレートが好きだ

STLが好きだ

Boostが好きだ

FC++が好きだ

Windows

Mac

Linux

BSD

Solaris

この地上でコンパイルされるありとあらゆるC++が大好きだ

演算子を多重定義できるC++が好きだ

演算子意味が変わり、直感的なコードが書き下せる時など心がおどる

テンプレートが使えるC++が好きだ

動的言語の優位性を語っている奴等にそれを見せた時など胸がすくような気持ちだった

Boostが好きだ

Boost::lambdaを使って(_1 + _2)と二つの引数を足算した結果を返す無名関数を定義した時など感動すらおぼえる

Boost::regex正規表現を書く時などもうたまらない

Boost::shared_pointerでオブジェクト自動的に解放されるのは最高だ

納期に追われて急いで書かなければならないパーサを

Boost::spiritBNF記述して書いた時など絶頂すら覚える

マルチパラダイムC++が好きだ

そんなC++が複雑だと思われているのはとてもとても悲しいものだ

テンプレートが好きだ

エラーメッセージ意味不明だと言われるのは屈辱の極みだ

諸君 私はC++を 変態の様なC++を望んでいる

諸君 私に付き従うC++好きの諸君 君たちは一体何を望んでいる?

更なるC++を望むか 

糞の様なC++を望むか?

BoostFC++によってさらに変態的になっていくC++を望むか?

C++!! C++!! C++!!

よろしい ならばC++

だが、LL全盛の時代の陰でもはや組み込みHPCぐらいでしか使われないという中傷に耐え続けて来た我々には

ただのC++ではもはや足りない!!

C++を!! 一心不乱の大C++を!!

我々はわずかに小数

PerlPHPPythonRubyJavaScriptに比べれば物の数ではない

だが諸君は一騎当千のBinarianだと私は信じている

ならば我らは諸君と私で総兵力100万と1人のコンピュータサイエンティスト集団となる

我らを忘却の彼方へと追いやり、インタプリタしか知らない連中を叩きのめそう

髪の毛をつかんで引きずり下ろし 眼(まなこ)をあけて思い出させよう

連中コンパイラの偉大さを思い出させてやる

連中インタプリタでは実用的なプログラムが書けないということを思い出させてやる

C++には奴らの哲学では思いもよらない書き方がある事を思い出させてやる

1000人のBinarianの集団で 世界変態的なコードで埋め尽くしてやる

目標 世界のありとあらゆるプログラム

一億総合コンパイル作戦 状況を開始せよ

逝くぞ 諸君


http://wids.net/lab/sukida.htmlで生成。

2008-04-18

http://anond.hatelabo.jp/20080418010901

ほう、その辺の本には「神」なんて言葉が乱舞しとるがな。じゃあ日本古典がどう宗教価値に直結しとるんだ?

そりゃ「影響」はしてるだろうがな。別にキリスト教の神である必然性などない。/いや、親鸞の書いたものは当然古語で書かれてるでしょ?

「一般人レベル」でいうのなら、欧米先進国様の古典を学ぶ意義と同程度のものは間違いなくあるよ。

いや、自明とか間違いなくとか言われてもなあ。具体的に挙げてくれる? 君の議論の最大の弱点って多分具体性がないことだから。

グレコ・ローマン文化の話じゃなかったのかよ。近代以降ならそりゃ当然だろ。

いや君がニュートンを引き合いに出したんでしょうに。民主主義に関してはギリシャにまで遡って意義深い書籍を見つけることは出来るだろうなあ。

ほら、君は「??だとすれば」という仮定が読めないんだよね。

で、いつまで撤回した仮定を引きずるわけ?w

あとさあ、まやかしまやかしで構わないけど、そういう意味なら俺は英語の「役に立つ」もまやかしだと思うがねえ。

何かひとつ共通言語がないとITなんてやってられん、というのは厳然たる事実だろ。

一方で、文化資本による格差なんぞないほうがいいに決まってる。

東大卒は毎年数千人だ。それで、MIT卒は何人いるか知ってる?ハーバードは?プリンストンは?スタンフォードは?オックスフォードは?ケンブリッジは?

数千人か。なおさらたいしたことないな。で、MIT卒全員をエリートと呼んだ覚えはないが?(他の大学もね)。

仮にそうだとしても、「年に数人」レベル人間「教育」なんておこがましいと思わんか。

まあそうね。勝手にどこかで学んできそうな気はする。

教育ってのは、特に公教育ってのは、底上げのためにやるもんであって。

誰も「普通東大生数百人のレベルをギリギリにチューンする」なんて言ってないし、そもそも東大生の中で「教育制度がもっとよければ俺はもっと偉くなれた!」なんて言ってる奴は落ちこぼれだけだよ。だから「普通東大生数百人のレベルをギリギリにチューンする」という発想自体がそもそも無意味

いや、お前そういう話しかしてなかったじゃんw 俺が公教育は平均と底辺を上げるためのものだと主張したらやたら激しく反発してたよなあ?

いや、主流の座から滑り落ちたものを普通スタンダードとは呼ばないだろう。

主流と標準を辞書で引くことをお勧めする。そりゃ、主流が標準を塗り替えてしまうことは結構あるが、少なくとも数値計算世界ではまだだろう。過去の蓄積ってのがあるんだ。

Cを使ってアセンブラまがいのコードを書き、新しい言語なんて覚える暇があったらもっと他のことをするとかなんとか言ってる人だって一定の比率で存在する。おわかり?

それは、特にアセンブラが必要でもないケースでか? ちょっと勘弁して欲しいなw まあ仕事としてうまくやれてるならそれでもいいけどさ、特殊ケースだろ?

まだ、例えば専用プロセッサなり組み込みデバイスなりを制御するためにアセンブラ使うってほうがはるかに一般的なケースだと思うがな。数値計算パターン認識においてさえ。

どうも話が巧妙にずらされてる気がするんだが。

いや、君自身RubyとかPerlとかC++とかJavaとかに言及しちゃったからねえ。どっちが引っ掛けたかというのは不毛になりそうだからやめようや。なんなら俺がズルかったということにしてもいいが。

たとえばいきなりJavaを覚えさせられた人間がそれがわかるとは到底思えない。ライブラリソースを読めるレベルになってはじめてわかることだろう、それは。

いや、Javaライブラリソースを読むレベルになったらたしかにかなり専門的だが、そもそもJavaで書いたコードで高速計算させようというほうが間違いなわけで。

C++に関して言うなら、アセンブラ的な最適化に手を出すのはだいたい最後の最後だろう。俺(や多分君)のような古い世代はアセンブラからの積み上げで高級言語を見るけど、高級言語の側から必要なレベルまで掘り下げていく、という見方も可能なはずだし、最適化の上ではむしろそちらが本筋。

で、君が重いクラスライブラリとして想定してるのはなんなの? ちゃんと最近のものを使ってれば、そんじょそこらの奴がCでちゃっちゃと書くコードと同じかたいていは速いコードを生成するし、もちろん可読性も高くなるな。

C++の話も同様。敢えて「C++らしい」処理を書けば計算量はどんどん増えて、例えば行列カプセル化して演算子オーバーロードしてなんてことやってたら計算時間が倍ぐらいになってもおかしくはないだろう。一晩で終わる計算が翌日の昼までかかるということになったら作業効率には歴然たる差が出るぞ。

具体的にどこの出してるC++行列演算ライブラリがそこまで効率悪いって?

(補足追記)

最近C++用の数値演算ライブラリはかなり出来がよく、FORTRAN用のそれに性能で肉薄するところまで来ている。そう、ここでは、ライバルは君が主流からも標準からも蹴落とされたと主張したいらしきFORTRANなんだよ。

で、どの辺がネックかというと、君の言うように記述性と実行速度の関係だったりはする。でも、それは低水準処理がどうこうという問題ではないよな。

この件については、議論してる人がネットでも結構いるから読んでみるといい。君が思うほどにC,C++圧勝しているわけではないよ。随分C++が向上してはいるけど。で、FORTRANのほうが言語の構造上最適化が効き易い等の話題はあっても、手作業で機械語レベル最適化をするなんてのは、候補にさえ挙がらないな。

http://anond.hatelabo.jp/20080417234519

あのさあ、「一般的にはこういうことが言われている」ということを主張したら、いつの間にか俺が「こういうこと」を主張していることになってるのはなんでなんですか、とさっきから何度も聞いてるんですが。「そうとしか思えないから」って、あんたの主観でしょ。しかもあんたが俺のことを色眼鏡で見てたことはあんたが自分で言ったことだし。

民主主義自由主義自然科学も、キリスト教論理的に直結はしていない。

ほう、その辺の本には「神」なんて言葉が乱舞しとるがな。じゃあ日本古典がどう宗教価値に直結しとるんだ?

それが「一般人レベル」か? 高校で教える価値があるかどうかは微妙だが。

これは確かに読み飛ばした、失敬。

日本古典の話をしてるんだが。とりあえず便宜的に日本言文一致体以前以後で区切ってみようか。

なんか、今でも一般人が学ぶ意義のあるような文献がそれ以前にある?

しつこいなあ。食い下がってるのはどっちだよ。「意義」の定義によるだろ。「一般人レベル」でいうのなら、欧米先進国様の古典を学ぶ意義と同程度のものは間違いなくあるよ。日本文化のうち文学美術舞台芸術に優れたものがあることは君も否定せんだろうが、それらの趣味思想だのなんだのに劣ることはあり得まい。

欧米政治思想の本なんかはそれこそニュートンの時代のとか普通に今でも重要でしょ。

グレコ・ローマン文化の話じゃなかったのかよ。近代以降ならそりゃ当然だろ。フランス革命1789年明治維新1868年の差が今更どれほど重要だとあんたが思ってるのかは知らんが(明治維新は不完全な革命とかいうなよ。そんなこと言えばロベスピエールとかナポレオンってのはどうなるんだ)。ただその意味で言うなら欧米であってもドイツなんかは後進国なんであって、あんたが言ってるのは「イギリスフランス」の話でしかない。「欧米」ではないぞ。

君の言うステータスシンボルのような意味での「役に立つ」自体を俺は批判し否定してるんだよ。まやかしだってな。で、撤回したんじゃなかったか? やっぱ食いさがってんじゃんww

一方で、海外のほとんどのライブラリドキュメント英語で書いてあるから、英語はとても役に立つなあ。

ほら、君は「??だとすれば」という仮定が読めないんだよね。背理法とか理解できてないんじゃないの?出来の悪い中学生とかで、「もし√2=p/qと既約分数で書けたとするとpもqも偶数になるが」とかいうと、「pもqも偶数なわけないだろ!」とか言って聞かないガキがいるよね。

あとさあ、まやかしまやかしで構わないけど、そういう意味なら俺は英語の「役に立つ」もまやかしだと思うがねえ。

とりあえず、「まやかし」と「役に立つ」をあんたはどういう基準で使い分けてるのか明示してくれ。でないと話にならん。

えーと、そういう主張をしたいのならまずソースよろ。

はあ?何のソースだよ。俺は君の主張を自然演繹しただけであって、敢えて言うならソースは君の発言だが。

俺の言ってるのは、ただの東大卒程度でエリートなんて呼ぶ必要ないだろ、ってことなんだが。毎年数百人も生まれるのに。

東大卒は毎年数千人だ。それで、MIT卒は何人いるか知ってる?ハーバードは?プリンストンは?スタンフォードは?オックスフォードは?ケンブリッジは?

本当に新天地を切り開くようなエリートってのは、せいぜい数人程度だろ。その数人にどういう教育をするかと考えた場合、国内でまかなおうなどと無駄な縄張り意識を発揮するよりは、とりあえず世界トップレベル大学に送り込めばいいんじゃないの、と。

天才信仰ですか。まあいいや。仮にそうだとしても、「年に数人」レベル人間「教育」なんておこがましいと思わんか。そんな人間はほっといても自分に最適な場所を探してくるし、そこが日本である可能性もあれば海外である可能性もある。

国を背負うほどのものでもない普通東大生数百人のレベルをギリギリにチューンすることに金を使うよりは、普通大学を出る普通の何万人のレベルを上げるほうが安上がりだし価値があるんじゃねえの、と。

誰も「普通東大生数百人のレベルをギリギリにチューンする」なんて言ってないし、そもそも東大生の中で「教育制度がもっとよければ俺はもっと偉くなれた!」なんて言ってる奴は落ちこぼれだけだよ。だから「普通東大生数百人のレベルをギリギリにチューンする」という発想自体がそもそも無意味

俺はFORTRANを主流だとは言ってないと思うがね。スタンダード(標準)だとは言ったが。主流と標準の違いは分かるよな?

いや、主流の座から滑り落ちたものを普通スタンダードとは呼ばないだろう。そう言えるからには、後続のものがスタンダードを一つの目標に据えて設計されたとかそういう事情が必要だ。ちなみに釘をさしておくが、別にこの主張に固執するつもりはないから反論は不要。否定してくれてかまわん。

でも、コアの計算部分がライブラリに分離されちゃうケースが増えると、ますます低水準処理がどうこういう意味がなくなるような。

出来合いのライブラリを使ってない研究者だって沢山いるし、そもそも計算アルゴリズム自体に工夫をする人だっているわけでな。その辺は計算の規模と計算機リソースの兼ね合いと、あるいは本人が計算機を好きか嫌いかなんていう、実に卑近な事情によって決まってくる。それこそ情報工学の研究者であっても、俺が例に挙げたパターン認識待ち行列研究者の中には計算機の実践的側面なんかに興味がなく、Cを使ってアセンブラまがいのコードを書き、新しい言語なんて覚える暇があったらもっと他のことをするとかなんとか言ってる人だって一定の比率で存在する。おわかり?あんたの言ってる「情報工学」は「コンピュータ工学」でしかないことに気付いてほしいな、いい加減に。そこだけ理解してもらえればあとはどうでもいい。そうすれば、あんたが噛み付いてる点自体が枝葉末節だってことにも気付くだろうし。

自分の書いたコード計算機のなかでどういう風に動くかというイメージを持っておけば見通しがよくなるだろ

前にも書いて綺麗に見ない振りされたけど、それ言語の選択と無関係だよね。

<<

元々の話覚えてるか?「低レベル寄りの言語を知識としてだけでも知らない人間に」云々という話だっただろう。どうも話が巧妙にずらされてる気がするんだが。たとえばいきなりJavaを覚えさせられた人間がそれがわかるとは到底思えない。ライブラリソースを読めるレベルになってはじめてわかることだろう、それは。

C++の話も同様。敢えて「C++らしい」処理を書けば計算量はどんどん増えて、例えば行列カプセル化して演算子オーバーロードしてなんてことやってたら計算時間が倍ぐらいになってもおかしくはないだろう。一晩で終わる計算が翌日の昼までかかるということになったら作業効率には歴然たる差が出るぞ。

2008-02-08

C++を学びたての頃、演算子オーバーロードとかで「あれ、無名関数とか作れるんじゃね?」と思ってたのに既にboostにlambdaが。

あああああああああつまんねーなちきしょーおおおおおおおおおあああああああああああ

2008-02-02

http://anond.hatelabo.jp/20080202132609

や、ごめん。

あくまでその2択だったらの話しね。

個人的には気軽にはじめたいならPHPでいいと思うよ。

PHP5からならrubyは比較的なじみやすい。

正直ぺーる(?)は、自分はあまりやっていないけど、他の言語と似てるっていう既視感があまりない。

ファイルの読み書きに特化しているというかなんというか…

ファイルテスト演算子みたいなインターフェイスって他の言語であったっけ??

なんとなくFORTRAN覚えるぐらい分岐された網だと思うよ。

ただ、ぺーる(この言い方気に入った・・・)はもう下草は刈ってあるので歩きやすいんじゃないかな。

ジュンク堂みたいな大型書店にいって一番本の種類が多い言語を始めるのが入門者には吉。

rubyは自分でナタもって自分で道をつくって進める人にしかまだ無理だとおもう。

そういう意味で入門としてはperlPHPからはじめるのがいいんじゃね。

Rubyをやるメリットってこの後rubyメジャーになったとき第一人者になれるという点なんだけど、

初心者がやっても地力の点で後続から入った慣れた人に抜かれてその優位性を確保しつづけられない。

追記:

あ、あくまでLLの話しね。

ぺーるもphpも所詮はLLだから、本屋にいけばマーケットのサイズもおもずと察せられるとは思う。

こんなに盛り上がるのはここがLL界隈だからというだけだとおもう。

2008-01-18

はてなブックマークの収集スクリプトを書いてみた

ので、その結果を貼ってみます。とりあえず、はてなブックマークが始まってから1ヶ月(2005/2/10〜2005/3/9,1033エントリ)の、ブックマーク数によるベスト10を出しました。

ここで皆さんにお願いがあるのですが、今回のベストX以外にどういう観点でデータを抽出したら良いか(どういう一覧がほしいか)、コメントをいただけませんか?データは集めてみたものの、活用方法に困ってます。

1位:Ajax: Web アプリケーション開発の新しいアプローチ
2位:Google検索コマンドと演算子一覧/Web検索! メタサーチ/
3位:Wikipedia
4位:Google
5位:通知表の所見欄に書きたいけど書けない(性格を表す)言葉を書きかえる一覧表
6位:正しい知識を得たい人の爲のCSS2リファレンス
7位:Jess : Automated Japanese Essay Scoring System
8位:窓の杜 - 【特集】「Firefox」プラグイン特集 第1回
9位:ITmedia
10位:スラッシュドット ジャパン

====================

でした。

当時はまだ「有名サイトトップページにとりあえず貼っておく」みたいな使われ方をしていますね。ブックマークをどう使うか、というスタイルを探していたんでしょうか。

ちなみにこのときのキーワード出現回数のベスト20は

b:keyword:コンピュータ(330回)」「b:keyword:ウェブ(321回)」「b:keyword:一般(147回)」「b:keyword:はてな(77回)」「b:keyword:Google(67回)」「b:keyword:サイエンス(47回)」「b:keyword:blog(42回)」「b:keyword:ゲーム(41回)」「b:keyword:Internet Explorer(33回)」「b:keyword:はてなブックマーク(31回)」「b:keyword:RSS(30回)」「b:keyword:Microsoft(30回)」「b:keyword:JavaScript(29回)」「b:keyword:読書(28回)」「b:keyword:iPod(25回)」「b:keyword:firefox(25回)」「b:keyword:Apple(24回)」「b:keyword:ニッポン放送(23回)」「b:keyword:サービス(23回)」「b:keyword:音楽(20回)」

で、タグベスト20は

b:t:web(88回)」「b:t:blog(65回)」「b:t:ネタ(59回)」「b:t:news(49回)」「b:t:はてな(42回)」「b:t:it(33回)」「b:t:hatena(33回)」「b:t:社会(30回)」「b:t:ニュース(28回)」「b:t:neta(27回)」「b:t:misc(26回)」「b:t:ajax(26回)」「b:t:tool(25回)」「b:t:software(24回)」「b:t:tips(23回)」「b:t:javascript(23回)」「b:t:ブログ(22回)」「b:t:まとめ(21回)」「b:t:livedoor(20回)」「b:t:google(20回)」

でした。当時から「ネタタグって多かったんですかね(タグキーワード現在の付与状況しか分からないので、当時の本当の状態が分からない)。

2007-11-06

http://anond.hatelabo.jp/20071106063144

&=
代入演算子。左辺と右辺の値のビット単位のANDを、左辺に代入する。
=&
こんなもの存在しません。&はリファレンス(参照)です。$a=&$bは、$a = &$bと解釈すべきでしょう。

2007-11-05

phpの=&ってどういう演算子なんですか?

=を使っててうごかねーなんでだーと物凄い時間悩んでいて、似たような処理で意味もわからずコピペ

=&を使っていたことを思い出して=&に変えてみたら即動くようになり、なんなんだこれはーーーーーー

と余計に頭がこんがらがってきました

2007-06-22

javascriptを理解するためのたった2つの大切なこと:改

9割ぐらいはハッシュ

何がハッシュなのか

javascript存在するほとんどオブジェクトの実体はハッシュだよ。

var arr = [0,1,2,3];

とかをみると配列(人によってはリスト)に見えると思う。でも実際は違うんだ。

これは

var has = {0:0,1:1,2:2,3:3};

と基本的には等価なんだ。ただちょっと束縛されているメソッド(インターフェイス)が違うだけ。

ためしに

arr[4] = 4;
arr['x'] = 'string';
arr[-1]  = -1;

としてみよう。

Firebugで確認してみると[0, 1, 2, undefined, 4]というような値がかえってくるよ。

でもarr[-1]やarr['x']の値は保存されてないのかな?そんなことはないちゃんとアクセスできるんだ。

それどころかarr.xで'string'がかえってくるんだ。

別の例を見てみよう。

var fx = function(){};
fx[0] = 'somestring';

こうするとfx[0]に'somestring'が束縛される。

つまりfunctionも一つのハッシュだったんだ。

これでほとんどのものがハッシュだということが解ってくれたかな?

ハッシュじゃないのは文字列とか数字とかそいういシンプルなものだけなんだ。

ハッシュへのアクセス

ハッシュへはhash[name]でアクセスすることが出来る。

それ以外にもname演算子や空白を含まなくて頭が数字でない場合はhash.nameでアクセスできるんだ。

これでhash[name]が関数だったらhash.name(args)とできるよ。まるでメソッドみたいだね。

関数のあれこれ

無名関数

関数には名前を付けなくても使用可能だよ。

function(x){return x+x}(2); -> 4
宣言文

関数宣言の書き方って次見たいの覚えてる人が多いんじゃないかな?

function funcname(args){ do something};

でもこれはsystax sugerだってことを知ってほしい。

上でも使ってるんだけど。

var funcname = function(args){ do something};

等価になる。もちろんどちらの書き方でもかまわないよ。

ただ、(無名)関数を宣言してそれをfuncnameに束縛しているっていうことを理解しておくと便利だよ。

スコープ closure

javascriptレキシカルスコープを採用してるんだ。

レキシカルスコープなんていうと難しく感じるかもしれないけど、結構単純なんだ。

var x = 'global';
var fx1 = function(){return x};
var fx2 = function(){var x = 'local';return x}

これの実行結果は以下になるよ。

fx1() -> 'global'
fx2() -> 'local'
fx1() -> 'global'

fx2の変数xはほかの場所に影響しないんだ。これは関数の中と外ではスコープが違うからなんだ。

でも以下のような場合に注意してほしいな。

var x = 'global';
var fx1 = function(){return x};
var fx2 = function(){x = 'local';return x}
fx1() -> 'global'
fx2() -> 'local'
fx1() -> 'local'

fx2は自分のスコープ変数xがないからその外側スコープに探しに出かけたんだ。

つまり宣言文varはそのスコープに新しい名前を登場させる機能なんだよ。

別の場合を見てみようね。

var x = 'global';
var fx1 = function(){
  var x = 'local';
  return function(){return x}
};
var fx2 = fx1();
x -> 'global'
fx2() -> 'local'

この例だとfx2()の値がlocalになってるね。

なぜなら外側スコープっていうのは関数を評価した場所じゃなくて、関数を定義した場所の外側なんだ。

関数は返り値として関数ハッシュを指定できるよ。

一つ上の例では実際に関数を返り値にしているね。

戻り値関数を指定するとこんなことが出来るよ。

var fx1 = function(){
  var x = 0;
  return function(){
    x = x+1;
    return x;
  }
};
var fx2 = fx1();
var fx3 = fx1();
fx2() -> 1
fx2() -> 2
fx2() -> 3
fx3() -> 1
fx3() -> 2

fx2とfx3の値が違うのはそれぞれ別の関数が作られるからだよ。

こんな風に関数が状態を持つことも出来るんだ。クロージャーとよんだりするよ。

関数ハッシュを使って複数の関数を返すとこんなことも出来るよ。

var fx = function(){
  var x = 0;
  return {
    'up':function(){
      x = x+1;
      return x;
    },
    'down':function(){
      x = x-1;
      return x;
    }
  }
};
var obj = fx();
obj.up(); -> 1
obj.up(); -> 2
obj.down(); -> 1
obj.down(); -> 0

最後に一度ハッシュについてもうちょっとだけ。thisのはなし。

thisという機能があるよう。ちょっとだけつかってみるね。

var x = 0;
var add = function(n){this.x = this.x + n; return this.x};
var mul = function(n){this.x = this.x * n; return this.x};
var obj = {'x':0,'do':add};
add(1);   -> 1
add(1);   -> 2
mul(2);   -> 4
obj.do(); -> 1
obj.do(); -> 2
obj.do = mul;
obj.do(); -> 4

thisは評価された場所によって値がかわるよ。

objの中にいるときはobj.xを扱うし、グローバルにいるときはグローバルのxを扱うんだ。

http://anond.hatelabo.jp/20070620200618を改訂してみたよ。

このぶんしょうがjavascriptを覚える上の一助になるとうれしいんだ。

あとここでつかってるハッシュ伝統的な意味連想配列のことね。

突っ込みも大歓迎だよ。

2007-06-20

javascriptを理解するためのたった2つの大切なこと

9割ぐらいはハッシュ

何がハッシュなのか

javascript存在するほとんどオブジェクトの実体はハッシュだよ。

var arr = [0,1,2,3];

とかをみると配列(人によってはリスト)に見えると思う。でも実際は違うんだ。

これは

var has = {0:0,1:1,2:2,3:3};

と基本的には等価なんだ。ただちょっと束縛されているメソッド(インターフェイス)が違うだけ。

ためしに

arr[4] = 4;
arr['x'] = 'string';
arr[-1]  = -1;

としてみよう。

Firebugで確認してみると[0, 1, 2, undefined, 4]というような値がかえってくるよ。

でもarr[-1]やarr['x']の値は保存されてないのかな?そんなことはないちゃんとアクセスできるんだ。

それどころかarr.xで'string'がかえってくるんだ。

別の例を見てみよう。

var fx = function(){};
fx[0] = 'somestring';

こうするとfx[0]に'somestring'が束縛される。

つまりfunctionも一つのハッシュだったんだ。

これでほとんどのものがハッシュだということが解ってくれたかな?

ハッシュじゃないのは文字列とか数字とかそいういシンプルなものだけなんだ。

ハッシュへのアクセス

ハッシュへはhash[name]でアクセスすることが出来る。

それ以外にもname演算子や空白を含まなくて頭が数字でない場合はhash.nameでアクセスできるんだ。

これでhash[name]が関数だったらhash.name(args)とできるよ。まるでメソッドみたいだね。

関数のあれこれ

スコープ

javascriptレキシカルスコープを採用してるんだ。

var x = 'global';
var fx1 = function(){return x};
var fx2 = function(){var x = 'local';return x}

これの実行結果は以下になるよ。

fx1() -> 'global'

fx2() -> 'local'

fx1() -> 'global'

fx2の変数xはほかの場所に影響しないんだ。これは関数の中と外ではスコープが違うからなんだ。

でも以下のような場合に注意してほしい。

var x = 'global';
var fx1 = function(){return x};
var fx2 = function(){x = 'local';return x}

fx1() -> 'global'

fx2() -> 'local'

fx1() -> 'local'

fx2は自分のスコープ変数xがないからその外側スコープに探しに出かけたんだ。結果fx

つまり宣言文varはそのスコープに新しい名前を登場させる機能なんだよ。

宣言文

関数宣言の書き方って次見たいの覚えてる人が多いんじゃないかな?

function funcname(args){ do something};

でもこれはsystax sugerだってことを知ってほしい。

上でも使ってるんだけど。

var funcname = function(args){ do something};

等価になる。もちろんどちらの書き方でもかまわないよ。

ハッシュを返す関数関数を返す関数。closureとthis

関数は返り値として関数ハッシュを指定できるよ。次のハッシュを返す関数を見てみよう。

var fx = function(){
  var x = 0;
  return {
    'x':x,
    'add1':function(y){this.x = this.x+y;return this.x},
    'add2':function(y){x = x+y;return x}
  }
}
var obj = fx();

実行結果を見てみよう

obj.x -> 0
obj.add1(0) -> 0
obj.add1(0) -> 0

obj.x -> 0
obj.add1(1) -> 1
obj.add1(0) -> 0
obj.x -> 1

obj.x -> 1
obj.add1(0) -> 1
obj.add1(2) -> 2
obj.x -> 1

となる。

add1はthis.xにたいして演算をしている。つまり返された値が変化しているんだ。

add2は関数fxに閉じ込められた値に対して演算している。つまりこれらは別の値なんだ。

とここまでかいたら疲れた。

読んでくれた人ありがとう

追記

落書きのつもりでかいたんだけどブクマがついててびっくり。

ちゃんとまとめてなかったし、自分のブログに描いても見てくれる人はいないから増田に書いてみたよ。

ほかの言語技術についても同じような解説が欲しかったら何らかの方法で言及してくれるとうれしいな。

さらに追記

ここまではてブが300突破してるみたいだけどいま、自分のブログリンクを張ったら増田に書く意味がなくなるんじゃないかと思うんだ。

やらないけど。

こんなのもかいてみたよ、増田で。 http://anond.hatelabo.jp/20070621153600

2007-05-08

FizzBuzz問題

1から100までの整数プリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。

ただし、剰余(Rubyでいう % 演算子や modulo)を使うな。

2007-04-12

http://anond.hatelabo.jp/20070412033952

私は「result」派

っていっても、あまり使わない。返す値が決定したら、その時点でreturnを使う。

それが出来ないときに使うのがresultって感じだ。

ちなみに、元記事の奴は、そんなときこそ三項演算子とか思うな。

int func(int a, int b, int c) {
    int retVal;
    retVal = (a == 0) ? funcB(c) : funcA(b);
    return (retVal > 0) ? funcC() : retVal;
}

二番目の三項演算子はちょっと微妙だけどね

    if (retVal > 0)
        return funcC();
    return retVal;

でも良いけど、(retVal > 0)の意味しだいかな。

規約の人

こういうの書くのはお寒いかもだが、あれは半分ネタで半分本気です。増田は滅多に使わないけど、いろいろ意見が聞けて良い。それはともかく

あるあるw自動変数についてはどう名前付けても良いと思います(常識的な範囲で)。

はい。

自分は8タブです。誰がなんと言おうとw三項演算子は使いどころを間違えなければいいんだけどね。自分もJavaScriptを弄くり回していた頃、トリッキーコードを書きまくってました。

K&Rスタイルですね。

CやC++ではハンガリアン記法は有効だと思いますが、ゆとりプログラマですのでwPython自体はあまり好きじゃないけど、IronPythonはホントに面白い。

新しい行に中括弧を置かないというのは、秀丸アウトライン解析を利用するためでもあります。でないと正規表現が書けないので。

2007-04-11

俺々コーディング規約

新しい行に開き中括弧を置くな。

int Hoge(int n)
{
	int i, retVal = 0;
	for(i = 1; i <= n; i++)
	{
		retVal += i;
	}
	return retVal;
}

↑いい加減死滅して欲しい。イラッとするから。

for(i = 0; i < 9; n += i, i++);
{
	// 略
}

スペースインデントを使うな。

  • インデント幅を押しつけるプログラマは、もういらない。
  • Tabインデントならば設定で好みの幅に変えることが出来る。
  • ただし、演算子引数の桁を揃える場合などは、ブロックインデントはTab、それ以降をスペースによって行うこと。

ifなどのステートメントの中括弧を省略するな。

if(n == 0)
	hoge();

↑不許可である。

  • トラブルの元。面倒くさがらず、中括弧を必ず付けるべし。

三項演算子匿名関数などをむやみやたらに使うの禁止。

  • 分かりづらいだけ。

命名基準は統一せよ。

ログイン ユーザー登録
ようこそ ゲスト さん