ifの再定義

PHP で Yコンビネータ

booleanとif文も全部関数だけで実現できちゃった。

やってみた。

gosh> (define (true x y) x)
true
gosh> (define (false x y) y)
false
gosh> (define (if f x y) (f x y))
if
gosh> (if true 1 2)
1
gosh> (if false 1 2)
2

ホントダ。

lambdaだけにする。

gosh> ((lambda (f x y) (f x y)) (lambda (x y) x) 1 2)
1
gosh> ((lambda (f x y) (f x y)) (lambda (x y) y) 1 2)
2


Cでもやってみよう〜。

#include <stdio.h>

int my_true(int x, int y)
{
    return x;
}

int my_false(int x, int y)
{
    return y;
}

int my_if(int (*f)(int, int), int x, int y)
{
    return f(x, y);
}

int main(void)
{
    printf("%d\n", my_if(my_true, 1, 2));
    printf("%d\n", my_if(my_false, 1, 2));

    return 0;
}

無名関数が無いのでここまで。

えい。

1
2

うっは。


調子に乗ってきたのでマクロで。

#include <stdio.h>

#define true(x, y) x
#define false(x, y) y
#define if(b, x, y) b(x, y)

int main(void)
{
    printf("%d\n", if(true, 1, 2));
    printf("%d\n", if(false, 1, 2));

    return 0;
}

いけぃ!!

1
2

おぉぉぉぉ。


しかし・・・

gosh> (define (f) (f))
f
gosh> (if true 1 (f))
...無限ループ

となってしまうため、ifは再定義出来ないのであった。残念!!


続く。