タグ

ブックマーク / blanketsky.hatenadiary.org (6)

  • アクセス制御の抜け穴 (OCaml編) - blanket log

    Obj.magic 最強、で終わらそうと思ったのですがそう単純な話でもないらしい。 まず OCaml の private メソッドは、Javaなどのprotected相当で、継承した先のクラスからアクセスすることができます。 しかし呼び出せるのは自分に対してだけで、引数として受け取ったオブジェクトに対して呼び出すといったことはできません。method f x = x#g などと定義すると、fの引数xには"gというpublicメソッドを持った型"しかつけられなくなります。 class hoge = object method private priv = print_endline "hoge:private" end class fuga = object inherit hoge as super (* hogeを継承 *) method priv = super#priv (* 同名の

    アクセス制御の抜け穴 (OCaml編) - blanket log
    hchbaw
    hchbaw 2008/10/03
  • アクセス制御の抜け穴 (Python/Ruby編) - blanket log

    ある既存クラスの private なメソッドを外から使えるかどうかという話。 他人の触れてはならないプライベートな領域に踏み入りたい! なんていう不埒な欲望が首をもたげて現れた時点で9割9分どっか不健全なわけで、すぐに首を洗って出直すか首を括って死ぬべきですが、それでも往々にしてそんな時のための抜け穴を、僕たち私たちのプログラミング言語は用意してくれていたりするようです。*1 言語としてみれば、そういった裏技が使えることが必ずしも悪なのかどうか。全くないといざというときに困る…かどうかはともかく少なくとも困るかもしれないという漠然とした不安がつきまとうということはあるかもしれない。 それにまぁ、パズル的に使うのは全然アリだと思います。むしろそっちがメイン。そういうの好きな人多いですしね。 というわけで前置きが長くなりましたが私が知ってる各言語についてまとめてみます (その言語をふつうに使っ

    アクセス制御の抜け穴 (Python/Ruby編) - blanket log
  • エラーモナド in Ruby - blanket log

    PHPの@演算子っぽいものをいじってたら Ruby でエラーモナドっぽいものができました。 こんな感じで使えます。 result = try { parseint("hoge") }. catch(ArgumentError){ -1 }. catch{|e| puts e; -2 } res_value = result.value if result.good? begin/rescue 書くのと見た目ほとんど変わりません。 最後まで拾われなかった例外は、value を呼んだ時に投げられます。 エラーハンドラをたくさん用意しておいて、順番に試して最初に例外吐かなかったものを採用、とか。 maybe_error = try { ... } result = handlers.inject(maybe_error) {|m,(e,h)| m.catch(e,&h)}.value コードはこ

    エラーモナド in Ruby - blanket log
    hchbaw
    hchbaw 2008/08/23
  • Pythonはじめました。 - blanket log

    パイソンという名前を初めて聞いたとき、モンティ・パイソンよりコルト・パイソンを思い浮かべた人はどれくらいいるんだろうかとかそんなことはどうでもよくて、巷で大人気のPython君です。 機会があったので触ってみることにしました。今までちょっとしたコード片を読むぐらいはちょくちょくあったのですが、10行以上書いたのは初めて。 とりあえず習作として、IRCの特定のチャンネルに常駐してログを取るものを作りました(irclogger.tar.gz)。apt-get で python-irclib を入れて、適当にマニュアルと irclib のソース(読みやすい!) を見ながら4時間ぐらい格闘して70行ぐらい。んで、一日一回ログをメールで投げるようにした。便利便利。何か面白げな動作をするbotに育ててみようかな。 実際使ってみた感想 Rubyと比べるとやっぱり読みやすいけど書きにくい(面倒くさい)とい

    Pythonはじめました。 - blanket log
    hchbaw
    hchbaw 2008/04/11
  • 降順ソート - blanket log

    (reverse . sort) 的なことをしたい時は rSort :: (Ord a) => [a] -> [a] rSort = sortBy (flip compare) でいいんだろか。compare関数はPerl/Rubyでいう <=> 一般化を考える sortBy (flip compare) が sortBy compare の逆順となるように、 一般に sortBy f の逆順は sortBy (flip f) で出来るので、次のように rSortBy を定義できる。 rSortBy :: (a -> a -> Ordering) -> [a] -> [a] rSortBy = sortBy . flip -- rSortByと比較関数で降順ソートを定義 rSort :: (Ord a) => [a] -> [a] rSort = rSortBy compare -- 第2

    降順ソート - blanket log
  • 畳み込み関数の比較 (fold / accumulate / inject / reduce) - blanket log

    つーか、fold の弱点として、言語によって引数の順番がまちまちで、 正直憶えきれないってのがあるんだよな。誰か対応表とか作ってくれんもんか。 jijixi's diary - fold, map, for-each この中から一つ選ぶとしたらどれ? 確かにいろいろとややこしいのでまとめてみました。 いくつかの言語について大雑把に表にすると次のような感じ。 言語 関数 Haskell, OCaml, Scheme, Erlang foldl* f init items C++ accumulate(begin, end, init, f) Ruby*, JavaScript items.inject(init, f) Python, Perl* reduce(f, items [, init]) 言語 畳み込む二項演算 Scheme(SRFI)*, Erlang f(item, acc)

    畳み込み関数の比較 (fold / accumulate / inject / reduce) - blanket log
    hchbaw
    hchbaw 2007/12/03
  • 1