No Such Blog or Diary

«Prev || 1 | 2 | 3 |...| 862 | 863 | 864 |...| 917 | 918 | 919 || Next»

ラムダ式をS,K,Iへコンパイル

自由変数のないラムダ式を S, K, I のコンビネータで記述するためのプログラムを書いてみた.演習の課題で S,K,I 以外のコンビネータを S,K,I で書けという問題があるそうだけどそんなのはプログラムでやるものだし(Bなんか手でやる気がしない).んで,毎度のごとく Haskell でコンパクトに.

data LExp = Lambda (Int, LExp)
          | Apply  (LExp, LExp)
          | Var    Int
          | S
          | K
          | I
ctc (Lambda (x, exp)) = let exp' = ctc exp in (ctc' exp' x)
  where
  ctc' (Apply (exp1, exp2)) x = Apply (Apply (S, ctc' exp1 x), ctc' exp2 x)
  ctc' (Var y) x = if y == x then I else Apply (K, Var y)
  ctc' l x = Apply (K, l)
ctc (Apply (exp1, exp2)) = Apply (ctc exp1, ctc exp2)
ctc x = x

ラムダ式 LExp はλ抽象,適用,変数と,コンビネータ S, K, I で.コンパイル自体はλ抽象を内側からコンビネータに変換していくだけ.変換はアプリケーションに関しては S にして,変数に関しては束縛されるなら I, そうでないなら K.

折角なのでコンビネータからラムダ式への変換(alpha変換, beta簡約)も書いて知ってるコンビネータも全部書いてみた CompileToCombinators.hs .

関数ポインタの判別?

C++ のテンプレートでテンプレート引数に関数ポインタが指定されたときだけ挙動を変えたい.でもやり方が良くわからない... ポインタかどうかの判定法は知ってるが,関数ポインタか否かはどうすれば?

Ornithopter

Project Ornithopterによると

noun An aircraft that derives all of its thrust and nearly all of its lift from flapping wings. In addition, an ornithopter retains 'bird like' characteristics such as its main wing in front and its stabilizing surfaces aft.

とのことで,鳥と同様に羽ばたきして飛ぶものらしい.鳥の詩でも聞こうかと Air 初回版のサントラの名前ってこんなんだっけ?と検索をかけ,単語を知ってから5年後にやっとその意味を知りましたとさ.ところで,私の Ornithopter はどこへ行ってしまったのやら... 見つからん.飛んでった?

考えていることがよくわかりません.芸を覚えさせるにはどうしたらよいのだろう? 一般には覚えないといわれているけど,本人が面白ければやるだろうし.ゲームでもしてくれると面白いのになぁ.

とある問題

「100 未満の整数の組で,逆数の和がちょうど 1 になる組み合わせを列挙せよ.」という問題をとあるところで見つけた.2^100 の組み合わせをやればいいのだけど何かうまい方法はないのだろうか?

今日の5の2&みなみけ

この2つが Amazon のお勧め本の上位に食い込んでいたのでそれらを消去するため購入.どっちも面白かったので良い買い物であった.とりあえず「立ってろ」に一票.

«Prev || 1 | 2 | 3 |...| 862 | 863 | 864 |...| 917 | 918 | 919 || Next»
Search
Feeds

Page Top