タグ

ブックマーク / athos.hatenablog.com (4)

  • 重箱の隅的Clojureのイケてないところ - Homoiconic Days

    この記事はClojure Advent Calendar 2011 4日目の記事です。 Clojureには,シーケンスや組み込みのイミュータブルなコレクション型,STMなどエレガントだといわれる様々な特徴がある。一方で,ときにプログラマを悩ませるような厄介な挙動や不自由さを感じる制約も結構あったりする。 今回は,僕がClojureを使い始めてから2年ちょっとの間に遭遇した,そういったClojureの"イケてない"部分のうち,現在の最新バージョン(v1.3.0)でも見られるものについてまとめてみた。 ネストしたloopをうまく扱えない ClojureはJVM上で実行されるため,(今のところ)末尾呼び出しが最適化されない。末尾再帰(ループ)を使いたい場合にはloop - recurを使う。たとえば,階乗を計算する関数factはloopを使って下のように定義できる。 (defn fact [n]

    重箱の隅的Clojureのイケてないところ - Homoiconic Days
    Hash
    Hash 2013/09/07
    読んだ
  • Clojureコンパイラの型推論器をとりだしてみる - Homoiconic Days

    clojure.orgには,Clojureについて次のような説明がある。 Clojure provides easy access to the Java frameworks, with optional type hints and type inference, to ensure that calls to Java can avoid reflection. http://clojure.org/ この型推論(type inference)は,Clojureの説明でたまに名前だけは出てくるものの,その実態についての説明にはほとんどお目にかかったことがない。そこで今回は,Clojureの型推論の機能をClojureから触れるようにして遊んでみよう。 Clojureになぜ型推論が必要か まずはじめに注意しておかないといけないのは,Clojureの型推論はMLやHaskellなどの静的

    Clojureコンパイラの型推論器をとりだしてみる - Homoiconic Days
    Hash
    Hash 2013/08/06
    実例付きでわかりやすい
  • 「ClojureでJavaクラスのコンストラクタをapplyする」をリフレクションで - Homoiconic Days

    元ネタは1年前の記事。 ClojureでJavaクラスのコンストラクタをapplyする - 水底で思うこと 解決方法 -> ClojureでJavaクラスのコンストラクタをapplyする - 地獄の日記 ClojureからJavaのコンストラクタを呼ぶ場合, (new Hoge foo bar) または (Hoge. foo bar) のように書く。ところが,これらの構文ではクラス名が静的に決まっている必要があるため,たとえば (let [c Hoge] (new c foo bar)) (let [c Hoge] (c. foo bar)) というようには書けない。また,applyを使って (apply Hoge. [foo bar]) とすることもできない。 インスタンスを生成するクラスを動的に変更したい場合というのはちょくちょくあって,そういう場合には今まで,オブジェクトを生

    「ClojureでJavaクラスのコンストラクタをapplyする」をリフレクションで - Homoiconic Days
    Hash
    Hash 2013/07/07
    リフレクション
  • Rubyで末尾再帰最適化をする。 - Homoiconic Days

    元ネタはPythonで末尾再帰最適化をする。 - wasabizの日記。Pythonのデコレータを使って、末尾再帰で書かれた関数に対して末尾呼び出し最適化(TCO)を行う、というものです(どうやってTCOを実現しているかの詳細についての説明はここでは割愛します)。 さて、元エントリでは「Pythonがすごいからこんなことができるんだ」という感じで書かれていますが、タネさえ分かればいろんな言語でできそうだということが分かったので、他の言語でも試してみることにしました。 まずはじめに、試しにScheme版を書いてみたものの、そもそもSchemeはTCOを勝手にやってくれるのであまり意味のない例になってしまいました。 その後、Scheme版をだいたいそのままRubyに書き直したのが以下のRuby版です。 class Module def tco(name) continue = [] first

    Rubyで末尾再帰最適化をする。 - Homoiconic Days
  • 1