タグ

2007年12月30日のブックマーク (14件)

  • Rubyで関数プログラミング 付録B1 【参照透明性の確保(2)】

    mind
    mind 2007/12/30
    ①(反復)は再帰で表現できますが、②(大域脱出)や③(例外)は…関数型言語の意味論を壊すことなく代用できる形が、継続渡し(continuation passing)。 //program counterに非常に近い…式の評価順序に依存しない関数型言語では必要
  • Programming Language Concepts

    Abstract interpretation 抽象解釈と訳されているようである。抽象実行とも訳されることがある。 定義としては、プログラムを全部計算することなく、そのプログラムの意味又は特性を画定することを目的とした部分実行ということになると思う。部分実行であるので、プログラムを全部実行してしまうわけではない。 これは、通常のプログラムの実行と比べると分かりやすい。通常のプログラム実行(通常のインタプリタ等の実行のこと)は、標準解釈(standard interpretation)と呼ばれるが、これとの対比で考えると、抽象解釈とは、コンパイル時に行われ、停止性を持つ、性質の調査には近似的であり、部分的なプログラムの実行であるということができる。それに対して、標準解釈は、実行時に行われ、必ずしも停止するわけではなく、しかし、特性の画定は決定的であり、全部を行うプログラムの実行ということ

  • http://wiki.ocaml.jp/index.php?%B4%D8%BF%F4%B7%BF%B8%C0%B8%EC%A4%CE%C8%E6%B3%D3

  • いげ太のブログ: [JavaScript] イベント上の this をめぐる攻防

    this といえば自分自身のインスタンスを参照するもの。OOP に染まったプログラマなら、そう理解しているのが普通だろう。しかし JavaScript において、this の参照先は実行されるコンテキストによって以下のように変化する。 イベント ハンドラ内では、イベントの発生源(イベント ソース)のオブジェクトを参照する。 オブジェクトのプロパティ内では、自分自身のインスタンスを参照する。 ここで重要なのは 1. の方が優先されるってこと。両方が成立する場合、つまりイベント ハンドラにインスタンス メソッドを指定した場合、当該メソッドに出現する this はイベントの発生源を指すということ。 さて注目すべきは、this がイベントの発生源を参照するのは、イベント ハンドラの内だけである点だ。イベント ハンドラから参照されるオブジェクト内では、それは適用されないのである。言い方を変えれば、イ

  • 第4回 JavaScriptでオブジェクト指向プログラミング

    (2)プロトタイプ・オブジェクトの変更はリアルタイムに認識 プロトタイプ・オブジェクト配下のメンバが(インスタンスにコピーされるわけではなく)暗黙的な参照を通じて、必要都度にアクセスされるという事実には、もう1つ大きなメリットがある。それは、インスタンスを生成した「後」に、基となるプロトタイプ・オブジェクトにメンバを追加した場合にも、これを認識できるという点である。 例えば、以下のような例を見てみよう。 var Animal = function() {}; Animal.prototype.name = "サチ"; var anim = new Animal(); Animal.prototype.sex = "メス"; // インスタンスの生成後にメンバを追加 window.alert(anim.sex); // 「メス」 もっとも、この性質は、先ほどの「暗黙的な参照」を理解していれば

    第4回 JavaScriptでオブジェクト指向プログラミング
    mind
    mind 2007/12/30
    このことから、JavaScriptにおいて、いったん形成されたプロトタイプ・チェーンはその後の変更にかかわらず保存される… ――プロトタイプチェーンは動的に生成されるが、変更消滅は…静的?? //
  • 第3回 変数の宣言とスコープ

    ■関数リテラルとFunctionコンストラクタにおけるスコープの違い 前回、関数を定義する構文として「関数リテラル」と「Functionコンストラクタ」について紹介した。 関数リテラル、Functionコンストラクタは構文的な違いこそあるものの、いずれも匿名関数を定義するという意味でほぼ同様の機能を提供する。ただし、関数内で入れ子に関数リテラル/Functionコンストラクタを使用した場合には、スコープの解釈が互いに異なる点に要注意。 以下に、具体的なコード例を挙げてみよう。 var num = 0; function scope() { var num = 1; // Functionコンストラクタ var myScope1 = new Function("", "window.alert(num);"); // 関数リテラル var myScope2 = function() { wi

    第3回 変数の宣言とスコープ
    mind
    mind 2007/12/30
    スコープ・チェーンは、個々の関数の実行コンテキストごとに形成される。で、実行コンテキストごとにローカル変数の独立性を保証 ――んー、動的scopeを使いたかったら、オブジェクトを動的に繋ぎ替えろ、と? //
  • プログラミング言語の進化を追え:第1回 サルでも分かるプログラミング言語の新潮流【前篇】 (1/2) - ITmedia エンタープライズ

    近ごろプログラマーかいわいで、「関数型プログラミング言語」という言葉をよく耳にするようになった。連載では、プログラミング言語を取り巻く状況をあらためて俯瞰し、プログラミング言語開発の現場で何が起こっているのかを解説する。 はじめに 「ガーベジコレクション」、「リフレクション」、「アスペクト指向」、「クロージャ」、「イテレータ」、「型推論」など、近年、プログラミング言語の世界に新しい概念が続々となだれ込んでいるように見えます。しかし、これら「プログラミング言語の新潮流」の背景には、実はあまり知られていない歴史が隠されているのです。 プログラミング言語のメインストリーム プログラミング言語はお互いに影響を与えながら成長しています。プログラミング言語の歴史において、主要な言語がどのように影響を与えたかを、概略図に示しましょう(図1)。スペースの関係上この図では非常に簡略化しています*が、実際に

    プログラミング言語の進化を追え:第1回 サルでも分かるプログラミング言語の新潮流【前篇】 (1/2) - ITmedia エンタープライズ
  • 大人のためのブラックボックス読解講座――クロージャとオブジェクトの微妙な関係(その2)

    大人のためのブラックボックス読解講座――クロージャとオブジェクトの微妙な関係(その2):プログラミング言語の進化を追え(1/3 ページ) 前回に引き続き、Scheme言語の処理系、Gaucheを開発している川合史朗氏が、クロージャの機能を検証し、関数型言語とオブジェクト指向言語の関係について解説していきます。今回は、クロージャとオブジェクトのより深淵を探求します。 抽象化ツールとしてのクロージャ C++的なオブジェクトの世界では、オブジェクトの実体とは「ひとかたまりの構造体としてメモリ上に置かれたインスタンス変数の値」にすぎません。オブジェクトのポインタを取れば、それは事実上、その構造体へのポインタを持っていることになります。クロージャを「関数」中心で見ていると、その実体は「オブジェクト」の実体とは異質なもののように思えるでしょう。 確かにクロージャのナイーブな「実装」は、関数ポインタと環

    大人のためのブラックボックス読解講座――クロージャとオブジェクトの微妙な関係(その2)
    mind
    mind 2007/12/30
    (状態の共通項と、操作の繰返し とを括っていく) ――OOP志向とλ志向のどちらを視ても、経験的/bottom upなアプローチと、先験的/形而上的なアプローチがあるはず。人によって切り分け方が違ってきてしまうのが面白い //
  • 『大人のためのブラックボックス読解講座――クロージャとオブジェクトの微妙な関係』へのコメント

    ブックマークしました ここにツイート内容が記載されます https://b.hatena.ne.jp/URLはspanで囲んでください Twitterで共有

    『大人のためのブラックボックス読解講座――クロージャとオブジェクトの微妙な関係』へのコメント
  • Closure On JavaScript Closures

    mind
    mind 2007/12/30
    Looking at our conceptual diagram above, it's easy to see how a JavaScript engine might implement a closure*. All a nested function has to do is carry a reference to its activation object, which will keep all the variables and arguments in the scope chain alive. ―― //
  • 関数とクロージャ - ファイヤープロジェクト

    Common Lispでの関数の詳細についていろいろと試してみた. 関数の基 (setf 関数名)という関数名 大域関数と局所関数 関数のパラメータ レキシカル変数と関数とクロージャ 動的スコープ 関数の基関数は基的にdefunで定義する. (defun 関数名 パラメータリスト 体) 引数に1を加えて返す関数は以下のようになる. > (defun hoge (x) (+ x 1)) HOGE > (hoge 1) 2 関数の返り値は,体の最後の式の返り値,あるいは (return-from 関数名 値) で指定する値である.以下の関数はreturn-fromにより固定値5を返す.+式やformat式は無意味である. > (defun fuga (x) (+ x 1) (return-from fuga 5) (format t "fuga~%")) FUGA > (fuga 1

    mind
    mind 2007/12/30
    Lispにおける変数は,正確には大域変数か局所変数ではなく…レキシカル変数はレキシカルスコープを,スペシャル変数は動的スコープを持つ. ――動的変数はスタックだか連想リストに実装されるけど、静的変数/closureは…? //
  • 関数とクロージャ - ファイヤープロジェクト

    Common Lispでの関数の詳細についていろいろと試してみた. 関数の基 (setf 関数名)という関数名 大域関数と局所関数 関数のパラメータ レキシカル変数と関数とクロージャ 動的スコープ 関数の基関数は基的にdefunで定義する. (defun 関数名 パラメータリスト 体) 引数に1を加えて返す関数は以下のようになる. > (defun hoge (x) (+ x 1)) HOGE > (hoge 1) 2 関数の返り値は,体の最後の式の返り値,あるいは (return-from 関数名 値) で指定する値である.以下の関数はreturn-fromにより固定値5を返す.+式やformat式は無意味である. > (defun fuga (x) (+ x 1) (return-from fuga 5) (format t "fuga~%")) FUGA > (fuga 1

    mind
    mind 2007/12/30
    「フリーレキシカル変数を参照する関数」 は"(lexical) クロージャ/closure"と呼ばれる。 クロージャは関数とコンテキストを一つにした概念である。 ――これはスッキリ! //
  • 関数とクロージャ - ファイヤープロジェクト

    Common Lispでの関数の詳細についていろいろと試してみた. 関数の基 (setf 関数名)という関数名 大域関数と局所関数 関数のパラメータ レキシカル変数と関数とクロージャ 動的スコープ 関数の基関数は基的にdefunで定義する. (defun 関数名 パラメータリスト 体) 引数に1を加えて返す関数は以下のようになる. > (defun hoge (x) (+ x 1)) HOGE > (hoge 1) 2 関数の返り値は,体の最後の式の返り値,あるいは (return-from 関数名 値) で指定する値である.以下の関数はreturn-fromにより固定値5を返す.+式やformat式は無意味である. > (defun fuga (x) (+ x 1) (return-from fuga 5) (format t "fuga~%")) FUGA > (fuga 1

    mind
    mind 2007/12/30
    レストパラメータ&rest,オプショナルパラメータ&optional ――argument[]みたい。 //キーワードパラメータ&key ――hash/連想配列渡しみたい ――逆だって; //
  • 週記くらい - クロージャとは

    freehttp://d.hatena.ne.jp/smeghead/20071216/closure の続きというか今回はもうすこし真面目にあえて、コードレスで、自分の理解しているところのクロージャを説明してみるテストです。まず、誤解を恐れずに書いてしまうと、言語によってクロージャという機能が提供されている訳ではない。クロージャというのは、ある機能の副作用を用いたテクニックの名前である。クロージャと呼ばれているテクニックを使える言語は、以下の機能を提供しています。言い換えると、以下の機能の副作用によってクロージャというテクニックを使用できるようになります。 レキシカルスコープ(静的スコープ)関数がファーストクラスオブジェクト(第一級オブジェクト)であることレキシカルスコープオブジェクト(主に関数)が定義された時に、その場所から参照できる範囲を、オブジェクト(主に関数)の実行時にも参照でき

    mind
    mind 2007/12/30
    言語によってクロージャという機能が提供されている訳ではない。クロージャというのは、ある機能の副作用を用いたテクニックの名前である。 ――JとLって似てる。 //―― //