2002-05-29 [長年日記]
λ. 夕方まで寝てた。これでここんとろこの不足分を取り戻したぞー
λ. TinyC
こないだkjanaさんに紹介してもらった TinyC のコードにざっと目を通した。さて、どこから弄るかな……
λ. 誤変換
「総資産」を「荘子さん」と誤変換。あうあう……
λ. 続^2 Y Combinator
[ruby-list:35060]のFは、自分自身が定義域になっているようなnon-well-foundedなタイプなので考えにくくてしょうがない。
こういうのって、超集合論(hypersets)とかを知ってると、わりと楽に考えられたりするのだろうか?
λ. ところで、Y Combinator のようなトリッキーな事をしなくても同じことが出来るような仕組みを大抵の言語は持ってるのね。
- Schemeではletrecを使う
-
(define fact (letrec ((f (lambda (n) (if (zero? n) 1 (* n (f (- n 1))))))) f))
- Haskellのletは他の言語でのletrecに相当する
-
fact = let f n = if n == 0 then 1 else f (n - 1) * n in f
- Common Lisp だとlabelsを使う
-
(defun fact (n) (labels ((f (n) (if (zerop n) 1 (* n (f (- n 1)))))) (f n)))
- Smalltalk
- 使ったこと無いけど、thisContextという特殊変数でブロック自身を参照できるそうだ。