タグ

ブックマーク / blog.tojiru.net (6)

  • やり直しC言語:配列はファーストクラスではなかった

    C言語を久しぶりに触ってやっと理解できたのが、配列は第一級オブジェクト(ファーストクラスオブジェクト) ではない 、ということです。 第一級オブジェクト - Wikipedia 第一級オブジェクト Wikipediaによると、第一級オブジェクトと呼ばれるものは以下の様な特徴を持つそうな。 無名のリテラルとして表現可能である。 変数に格納可能である。 データ構造に格納可能である。 それ自体が独自に存在できる(名前とは独立している)。 他のものとの等値性の比較が可能である。 プロシージャや関数のパラメータとして渡すことができる。 プロシージャや関数の戻り値として返すことができる。 ... C言語だと、int(1, 2)やchar('a', 'b')、floatやboolなどがこれに相当します。また、任意の型へのポインタも、同じ性質を持っています。 私はC言語を真面目に勉強する前にJavaScr

    やり直しC言語:配列はファーストクラスではなかった
  • やり直しC言語:複雑な宣言の読み方

    C言語は宣言文が非常に読みにくいことで有名で、後発のGo言語はこれを批判して宣言の構文を変えています。私もずっと読むのが苦手だったのですが、私の頭が悪いのではなく、C言語の仕様がヘン、ということらしい。 今まで飽きるほどこの手の解説は書かれてきてるわけですが、自分なりにまとめないと覚えた気がしないので、あえてまとめておきます。ここに書いてある内容は、「C言語ポインタ完全制覇」に詳しく書いてあります。 型の派生 C言語では、int, char, floatなどの基型から、配列やポインタを派生していくことができます。対象を並べたものが配列で、対象を指し示すのがポインタです。 配列やポインタからも配列やポインタを派生できるので、派生パターンは無限に存在します。 int int の配列 int の配列 の配列 ... int へのポインタ int へのポインタ へのポインタ ... int への

    やり直しC言語:複雑な宣言の読み方
    pipehead
    pipehead 2015/09/22
    [], *, ()
  • switch文を使ってはいけない

    昔Qiitaで書いた内容なんですが、PHPswitch文は悪名高い「==」演算子で比較を行います。 <?php switch (true) { case 0: echo '数字の0'; break; case '0': echo '文字列の0'; break; case '0.0': echo '文字列の0.0'; break; case true: echo '真偽値のtrue'; break; } このコードは「文字列の0.0」を出力します。大変分かりにくいですね。 この点はif ... elseif ...を使えば解決するんですが、switchで書きたくなるようなコードをelseifにするとおそらく読みにくくなるでしょう。 ではどうするか。 正解はオブジェクトのポリモーフィズム(多態性)機能を使うことです。 といっても、多態性で調べて出てくる記事とか書籍に関しては抽象的な説明が多い

    switch文を使ってはいけない
    pipehead
    pipehead 2014/08/14
    State パターン
  • JavaScript:ブロック構文の性能比較

    ブロックスコープを作る構文をちゃんと性能比較してみました。 ブロック構文の性能比較 前回の記事で書いたcreateScope関数もセットにしました。 function createScope(prev) { var newScope, Scope=createScope.Scope; if (prev instanceof Object) { Scope.prototype = prev; newScope = new Scope; newScope.__outer__ = prev; return newScope; } else { Scope.prototype = null; return new Scope; } } createScope.Scope = function(){ this.my = this }; ひとまずFirefoxでの測定結果をのせます。 ブロック自体の生

    JavaScript:ブロック構文の性能比較
  • JavaScript:with構文によるブロックスコープ再考

    変態文法と聞いて胸がときめく人なら、ぜひマスターしておきたいのがJavaScriptのwith構文です。スピード狂やuse strict信奉者に蔑まれ、そのうち黒歴史として消滅しそうな哀れな構文ですが、消えるには惜しい。ちょっと光を当ててみましょう。 以下、パフォーマンス無視の文章でいきますのでよろしくお願いしますm(_ _)m with文の教科書的な説明 もともとwithはオブジェクトのメンバを展開するための構文でした。たとえばdocument.getElementById()などのDOMのメソッド類は多用すると思いますが、名前が長いですよね。せめてdocument.を省略できないものか、と誰もが思うでしょう。ちまちまやるなら、 var getElementById = document.getElementById, getElementsByName = document.getEl

    JavaScript:with構文によるブロックスコープ再考
  • 即時関数(function(){ ... })()の別の書き方いろいろ - 泥のように

    JavaScriptでよく使われるコード片に即時関数というものがあります。無名関数を宣言して即実行することで、ブロックスコープの存在しないJavaScriptにおいて擬似的にブロックスコープを再現します。 var a = "global"; (function(){ var a = "local"; alert(a); //local })(); alert(a); //global 一番有名なのはこの(function(){ ... })()の形式なのですが、なぜfunctionの外側にカッコが必要なのか不思議に思ったことはないでしょうか? ためしにfunction(){ ... }()と書いてみると、Syntax Errorが発生します。 なぜfunction(){ ... }()はSyntax Errorなのか JavaScriptにはfunction文とfunction式があって、

    即時関数(function(){ ... })()の別の書き方いろいろ - 泥のように
  • 1