Yコンビネータ書いてみました

package main

import "fmt"

type x_f func (a x_f) (func (a int) int)

func Y(f (func (a (func (a int) int)) (func (a int) int))) (func (a int) int) {
	return (
		func(proc x_f) (func (a int) int) {
			return f(
				func (arg int) int {
					return (proc(proc))(arg)
				}
			)
		}(
			func (proc x_f) (func (a int) int) {
				return f(
					func (arg int) int {
						return (proc(proc))(arg)
					}
				)
			}
		)
	)
}

func fact0 (f (func (a int) int)) (func (a int) int) {
	return (
		func (n int) int {
			fmt.Printf("* %d\n", n);
			if n == 0 {
				return 1
			}
			return n * f(n - 1)
		}
	)
}

func main() {
	var a int = (Y(fact0))(5);
	fmt.Printf("%d\n", a)
}

Go Go!!はGoogle様の協賛により開催されました

id:ranhaさんが書けと仰られた。

http://atnd.org/events/2115 に、当日気付いて、その時は15/15でしたのであきらめて寝て、半分ぐらい時間が過ぎてから目が覚めて、なんだか17/18になっていたみたいですので参加させていただきました。ありがとうございます。

上記Yコンビネータid:oskimuraさんと作りました。