タグ

ブックマーク / mametter.hatenablog.com (6)

  • 僕でもわかる継続と部分継続 - まめめも

    callcc と shift/reset についてわかるとこだけ書いてみます。 継続 callcc という操作は、現在から実行終了まで、継続をまるごと取り出します。例題。 p [1] + callcc {|k| [2] + k.call([3]) } #=> [1, 3] callcc では callcc がリターンしてから実行終了するまでの継続 k が取り出せます。k.call([3]) で継続が呼ばれると、いきなり「callcc が [3] を返した瞬間」に実行が飛びます。つまりこんな感じ。 p [1] + [3] あとは自明ですね。"[2] +" のあたりは無視されます。 部分継続 shift という操作は、現在から reset まで、継続の一部だけを取り出します。この継続の一部を部分継続といいます。例題。 p [1] + reset { [2] + shift {|k| [3] +

    僕でもわかる継続と部分継続 - まめめも
  • Ruby でパターンマッチ - まめめも

    ref: 未来の国のアリス - d.y.d. で紹介されている implicit future が Ruby に欲しい! # promise を作る x = Promise.new a = [1, x, 2, x, 3, x] # 今はまだ値になっていない p a #=> [1, _promise_, 2, _promise_, 3, _promise_] # この promise は 42 に決めた! (代入ではないよ) x === 42 # x の箇所は勝手に 42 になっている p a #=> [1, 42, 2, 42, 3, 42] というのも、これがあれば Ruby でパターンマッチができる気がするんですよね。こんな感じに。 # 何にでもマッチする箇所には _ と書く (実体は Promise.new) def _ Promise.new end # + と定数だけからなる抽象

    Ruby でパターンマッチ - まめめも
  • 回文や XML にマッチする鬼車の正規表現 - まめめも

    ref: 鬼車 正規表現 Version 5.9.1 ref: Ruby Freaks Lounge: 第6回 Ruby M17N 事始め:正規表現編 \g と \k について今までちゃんとわかってなかったけれど、少しわかったような気になったのでメモ。Ruby というより鬼車の話なので、PHP でも使えるかもしれない。試してないけど。 田中哲スペシャル \g の基 \g で参照される括弧の中身がそこにそのまま書かれたと思えばいい。 re = /\A(?<foo>abc...def)\g<foo>\z/ # \g<foo> を展開して考える # /\A(?<foo>abc...def)abc...def\z/ と同じ意味 p "abc123defabc123def".match(re) # マッチ p "abc123defabc456def".match(re) # マッチ p "abc1

    回文や XML にマッチする鬼車の正規表現 - まめめも
  • Ruby に callcc を公式にサポートさせよう - まめめも

    Ruby の callcc というと、 現在の Ruby の Continuation は欠陥品で、まともに利用できないシロモノです。具体的には、dynamic-wind 相当の機能がありません。 (略) ちなみに、dynamic-wind 相当の機能を入れるのは、拡張ライブラリを全部 callcc safe にする作業に相当しますので、現実的じゃないんじゃないかなぁ、と思っています。 ruby-dev:30988 という話があって、「そっかー欠陥品なのかー」「直すのも難しいのかー」と悲しんでいました。 が、dynamic-wind を実装するだけなら広範囲の修正は不要なことに気がつきました。つまり直すのは簡単。というエントリ。 その前に: dynamic-wind とは dynamic-wind とは、継続呼び出しで指定した範囲に突入したり脱出したりするときに起動するハンドラを設定する関

    Ruby に callcc を公式にサポートさせよう - まめめも
  • fisheye view の計算式とプログラム - まめめも

    fisheye view とは、なんかインターフェイスの世界では常識っぽい、フォーカスとなる点を中心に座標をぐにょーんと引き延ばす方法です。日語が不自由ですみません。要するにこういう変換です。 皇居あたりを中心に線路地図をぐにょーんと引き延ばしています。これを実装しようと思って計算式やサンプルプログラムを探したのですが、意外に情報が少なくて手間取りました。なので記録を残しておきます。 種類 参考文献 *1 を眺めたところ、cartesian fisheye と polar fisheye の二種類があるようです。左が cartesian で右が polar です。でもこの例だとほとんど区別が付かないですね。よく見ると端っこの方のつぶれ方が違います。 cartesian fisheye view フォーカスの座標を 、引き延ばしたい点の座標を 、壁の位置を とするとき ( になる) 、引き

  • rope ライブラリ - まめめも

    ICFPC で話題になった rope/cord ですが、特定の言語環境でしか使えないのはもったいない話です。そこで Ruby の拡張ライブラリとして実装しようとしました。 rope とは 以下の特徴を持った文字列の実装です。 文字列と文字列の結合が速い (O(log n)) らしい 部分文字列の切り出しが速い (O(log n)) らしい 部分の書き換えはできない 指定位置からの文字の取り出しは遅い (O(log n)) でも一文字ずつ順にたどるのは実用上は O(n) らしい 詳しい話はいなばさんの解説なり元論文なりを見てください *1 。 実装方針 Boehm GC 付属の Cord のコードを Boehm GC なしで動くようにする (リファレンスカウントを実装する) 。 Ruby 側のインターフェイスは String 互換 (ただし破壊的操作と正規表現機能はなし) ただ、C の文字列

    rope ライブラリ - まめめも
  • 1