Hello,Unlambda world!!

Hello,Unlambda world!!

`r`````````````````````.H.e.l.l.o.,.U.n.l.a.m.b.a. .w.o.r.l.d.!.!i
Hello,Unlambda world!!

うっは。

2行表示してみよう。

``r`````````````````````.H.e.l.l.o.,.U.n.l.a.m.b.a. .w.o.r.l.d.!.!i
 `r`````````````````````.H.e.l.l.o.,.U.n.l.a.m.b.a. .w.o.r.l.d.!.?i
Hello,Unlambda world!!
Hello,Unlambda world!?

苦戦。

3行はこうなるね。

``r`````````````````````.H.e.l.l.o.,.U.n.l.a.m.b.a. .w.o.r.l.d.!.!i
 ``r`````````````````````.H.e.l.l.o.,.U.n.l.a.m.b.a. .w.o.r.l.d.!.?i
  `r`````````````````````.H.e.l.l.o.,.U.n.l.a.m.b.a. .w.o.r.l.d.?.?i
Hello,Unlambda world!!
Hello,Unlambda world!?
Hello,Unlambda world??

ぜぇぜぇ。

.aだけ返す。

`r```k.a.bi
a

こうなると。

`r`.ai
a

ifっぺぇ。

どうやら、kは関数を作れるらしい。

``kABでAを返す。`kAで関数を返せるから。1行目だけ返そう。

```kk`r`````````````````````.H.e.l.l.o.,.U.n.l.a.m.b.a. .w.o.r.l.d.!.!i
    k`r`````````````````````.H.e.l.l.o.,.U.n.l.a.m.b.a. .w.o.r.l.d.!.?i
Hello,Unlambda world!!

しまった。スペルミスが大量に・・・。

UnlambdaはHaskellっぽい感じがする。結構ハマる。

SKコンビネータ

翻訳:プログラミング言語Unlambdaより。

カリー化されてるので、ちょっと違うけど、Schemeで書くと、

s

λfgx.fx(gx)
(define (s f g x)
  ((f x) (g x)))

k

λxy.x
(define (k x y)
  x)

らしい。

部分適用の仕組みがちょっとづつわかってきたぞ。

SKコンビネータを作ってみよう!!

カリー化部分も含め作ってみよう。

(define (k x)
  (lambda (y)
    x))

(define (s x)
  (lambda (y)
    (lambda (z)
      ((x z) (y z)))))

(((s k) k) s) ; #<procedure:s>

わーい。```skksが出来ちゃった。

SKKってそういえば・・・。

日本語変換ソフト!!

SKK = Iが念頭にあったって書いてあった。へぇぇぇ。

SKK = I

Schemeでカリー

どうやら、カリーな書き方も出来るらしい・・・。

(define ((k x) y)
  x)

(define (((s x) y) z)
  ((x z) (y z)))

へぇぇぇ。知らなかった・・・。

Bコンビネータ

何に使うのかイマイチなんだけど、いろんな部品に使えるらしい。

ちとむじぃのでメモ。

定義。

(define b ((s (k s)) k))

サンプル。

(((b x) y) z)

とりあえず中のxを料理

(b x)
(((s (k s)) k) x) ; bを展開
(((k s) x) (k x)) ; sを展開
(s (k x))         ; kを適用

で、y,zを料理

(((s (k x)) y) z)
(((k x) z) (y z)) ; sを展開
(x (y z))         ; kを適用

となる。

Bは関数合成に使うらしい。

B = λx.λy.λz. x (y z)


sとkだけでも読めるもんだな・・・。

メモ

繰り返し

```si
`k``s.H``s.e``s.l``s.l``s.o``sri
``si``si``si``si``si``si``si``si`ki
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello

まだイマイチ読めてない。``siの使いかたがポイントらしい。

おっと。公式発見。

```si `kX F
↓
`FX

公式を元に変換すると、最初のs i 関数 ループは何もやってない。

```si``si``si``si``si``si``si``si`ki
 ``s.H``s.e``s.l``s.l``s.o``sri

次に、ループの一個をsiとして、s i ループ 関数賭すると、

(関数 (ループ 関数))となって、関数を一回実行。

ループ 関数となるので、siを一個取り出して・・・最後はkiになるので、iを取り出して終了だ。


(有限コンビネータ 関数)という形になる。有限Yコンビネータだ。


無限にしてみる。

```sii
 ``s.H``s.e``s.l``s.l``s.o``sri

おぉぉ。無限ループ完成!!